为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:CREATE DEFINER=root
@localhost
FUNCTION fristPinyin
(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE V_RETURN VARCHAR(255);
DECLARE V_BOOL INT DEFAULT 0;
DECLARE FIRST_VARCHAR VARCHAR(1);
SET FIRST_VARCHAR = left(CONVERT(P_NAME USING gbk),1);
SELECT FIRST_VARCHAR REGEXP '[a-zA-Z]' INTO V_BOOL;
IF V_BOOL = 1 THEN
SET V_RETURN = FIRST_VARCHAR;
ELSE
SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');
END IF;
RETURN V_RETURN;
END
需要 mysql改写达梦
这个测试OK,可以参考
CREATE OR REPLACE FUNCTION fristPinyin(P_NAME VARCHAR2(255))
RETURN VARCHAR2(255) DETERMINISTIC
IS
V_RETURN VARCHAR2(255);
V_BOOL BOOLEAN := FALSE;
FIRST_VARCHAR VARCHAR2;
V_HEX VARCHAR2(8);
V_CODE PLS_INTEGER;
BEGIN
-- 获取字符串的第一个字符
FIRST_VARCHAR := SUBSTR(P_NAME, 1, 1);
-- 检查第一个字符是否为字母
IF REGEXP_LIKE(FIRST_VARCHAR, '[a-zA-Z]$') THEN
V_RETURN := FIRST_VARCHAR;
V_BOOL := TRUE;
END IF;
-- 如果不是字母,则根据Unicode码点查找拼音首字母
IF NOT V_BOOL THEN
V_HEX := RAWTOHEX(UTL_RAW.CAST_TO_RAW(FIRST_VARCHAR));
V_CODE := TO_NUMBER(V_HEX, 'XXXX');
CASE
WHEN V_CODE BETWEEN 0xB0A1 AND 0xB0C4 THEN V_RETURN := 'A';
WHEN V_CODE BETWEEN 0xB0C5 AND 0xB2C0 THEN V_RETURN := 'B';
WHEN V_CODE BETWEEN 0xB2C1 AND 0xB4EE THEN V_RETURN := 'C';
WHEN V_CODE BETWEEN 0xB4EF AND 0xB6E9 THEN V_RETURN := 'D';
WHEN V_CODE BETWEEN 0xB6EA AND 0xB7A1 THEN V_RETURN := 'E';
WHEN V_CODE BETWEEN 0xB7A2 AND 0xB8BF THEN V_RETURN := 'F';
WHEN V_CODE BETWEEN 0xB8C0 AND 0xB9FE THEN V_RETURN := 'G';
WHEN V_CODE BETWEEN 0xB9FF AND 0xBBF6 THEN V_RETURN := 'H';
WHEN V_CODE BETWEEN 0xBBF7 AND 0xBFA5 THEN V_RETURN := 'J';
WHEN V_CODE BETWEEN 0xBFA6 AND 0xC0AB THEN V_RETURN := 'K';
WHEN V_CODE BETWEEN 0xC0AC AND 0xC2E7 THEN V_RETURN := 'L';
WHEN V_CODE BETWEEN 0xC2E8 AND 0xC4C2 THEN V_RETURN := 'M';
WHEN V_CODE BETWEEN 0xC4C3 AND 0xC5B5 THEN V_RETURN := 'N';
WHEN V_CODE BETWEEN 0xC5B6 AND 0xC5BD THEN V_RETURN := 'O';
WHEN V_CODE BETWEEN 0xC5BE AND 0xC6D9 THEN V_RETURN := 'P';
WHEN V_CODE BETWEEN 0xC6DA AND 0xC8BA THEN V_RETURN := 'Q';
WHEN V_CODE BETWEEN 0xC8BB AND 0xC8F5 THEN V_RETURN := 'R';
WHEN V_CODE BETWEEN 0xC8F6 AND 0xCBF9 THEN V_RETURN := 'S';
WHEN V_CODE BETWEEN 0xCBFA AND 0xCDD9 THEN V_RETURN := 'T';
WHEN V_CODE BETWEEN 0xCDDA AND 0xCEF3 THEN V_RETURN := 'W';
WHEN V_CODE BETWEEN 0xCEF4 AND 0xD1B8 THEN V_RETURN := 'X';
WHEN V_CODE BETWEEN 0xD1B9 AND 0xD4D0 THEN V_RETURN := 'Y';
WHEN V_CODE >= 0xD4D1 THEN V_RETURN := 'Z';
ELSE V_RETURN := FIRST_VARCHAR; -- 如果不在范围内,则保留原字符
END CASE;
END IF;
RETURN V_RETURN;
END;
测试验证:
SQL> select fristPinyin('操作已执行') from dual;
行号 FRISTPINYIN('操作已执行')
---------- ------------------------------
1 C
SQL> select fristPinyin('a是正确的') from dual;
行号 FRISTPINYIN('a是正确的')
---------- ----------------------------
1 a
SQL> select fristPinyin('天天向上') from dual;
行号 FRISTPINYIN('天天向上')
---------- ---------------------------
1 T
SQL> select fristPinyin(' 不在') from dual;
行号 FRISTPINYIN('不在')
---------- ---------------------
1
已用时间: 1.805(毫秒). 执行号:667.
SQL> select fristPinyin('揄') from dual;
行号 FRISTPINYIN('揄')
---------- ------------------
1 Z
这个 fristPinyin 函数是对传入字符串第一个字取拼音缩写字头用的么?不过从给出的GBK编码范围看,貌似只对GB2312的一级汉字区域有效啊,超出部分取得的拼音缩写可能不对。