yinglong2001

根据中文拼音首字母排序、取得中文拼音首字母函数
介绍根据中文的首字母、笔画、部首排序函数【NLSSORT】:
 
1)、首字母
 
SELECT * FROM T_TABLE ORDER BY NLSSORT(NAME, \'NLS_SORT=SCHINESE_PINYIN_M\');
 
2)、笔画
SELECT * FROM T_TABLE ORDER BY NLSSORT(NAME, \'NLS_SORT=SCHINESE_STROKE_M\');
 
3)、部首
SELECT * FROM T_TABLE ORDER BY NLSSORT(NAME, \'NLS_SORT=SCHINESE_RADICAL_M\');
 
列表一行汉字
WITH A AS
(SELECT \'获取汉字拼音首字母\' W FROM DUAL)
SELECT SUBSTR(W, ROWNUM, 1) FROM A
CONNECT BY ROWNUM <= (SELECT LENGTH(W) FROM A);
返回结果









 
用汉字字符集对这个列表进行排序
WITH A AS  -www.2cto.com-
(SELECT \'获取汉字拼音首字母\' W FROM DUAL)
SELECT SUBSTR(W, ROWNUM, 1) FROM A
CONNECT BY ROWNUM <= (SELECT LENGTH(W) FROM A)
ORDER BY NLSSORT(SUBSTR(W, ROWNUM, 1), \'NLS_SORT=SCHINESE_PINYIN_M\');
返回结果









 
那么根据这个原理,上面输入一个拼音A打头的字"澳",后面输入一个B大头的字"吧",找到每个音节的起止的汉字是哪个
WITH A AS
(
SELECT ROWNUM RN, CHR(ROWNUM) C FROM DUAL CONNECT BY LEVEL <= 65535
)
SELECT * FROM A WHERE LENGTHB(C) = 2
AND RN > 32768  -www.2cto.com-
AND NLSSORT(C, \'NLS_SORT=SCHINESE_PINYIN_M\') > NLSSORT(\'澳\', \'NLS_SORT=SCHINESE_PINYIN_M\')
AND NLSSORT(C, \'NLS_SORT=SCHINESE_PINYIN_M\') < NLSSORT(\'吧\', \'NLS_SORT=SCHINESE_PINYIN_M\')
ORDER BY NLSSORT(C, \'NLS_SORT=SCHINESE_PINYIN_M\');
根据返回的结果,就能看到,A的结束和B的开始的汉子分别是:“驁” “八”,依次类推可以找到其他的分界点,那么最后的函数就是如下:
 
CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS
V_COMPARE VARCHAR2(100);
V_RETURN VARCHAR2(4000);
 
FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS
BEGIN
RETURN NLSSORT(P_WORD, \'NLS_SORT=SCHINESE_PINYIN_M\');
END;
BEGIN 

FOR I IN 1..LENGTH(P_NAME) LOOP
V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));
IF V_COMPARE >= F_NLSSORT(\' 吖 \') AND V_COMPARE <= F_NLSSORT(\'驁 \') THEN
V_RETURN := V_RETURN || \'a\';
ELSIF V_COMPARE >= F_NLSSORT(\'八 \') AND V_COMPARE <= F_NLSSORT(\'簿 \') THEN
V_RETURN := V_RETURN || \'b\';
ELSIF V_COMPARE >= F_NLSSORT(\'嚓 \') AND V_COMPARE <= F_NLSSORT(\'錯 \') THEN
V_RETURN := V_RETURN || \'c\';
ELSIF V_COMPARE >= F_NLSSORT(\'咑 \') AND V_COMPARE <= F_NLSSORT(\'鵽 \') THEN
V_RETURN := V_RETURN || \'d\';
ELSIF V_COMPARE >= F_NLSSORT(\'妸 \') AND V_COMPARE <= F_NLSSORT(\'樲 \') THEN
V_RETURN := V_RETURN || \'e\';
ELSIF V_COMPARE >= F_NLSSORT(\'发 \') AND V_COMPARE <= F_NLSSORT(\'猤 \') THEN
V_RETURN := V_RETURN || \'f\';
ELSIF V_COMPARE >= F_NLSSORT(\'旮 \') AND V_COMPARE <= F_NLSSORT(\'腂 \') THEN
V_RETURN := V_RETURN || \'g\';
ELSIF V_COMPARE >= F_NLSSORT(\'妎 \') AND V_COMPARE <= F_NLSSORT(\'夻 \') THEN
V_RETURN := V_RETURN || \'h\';
ELSIF V_COMPARE >= F_NLSSORT(\'丌 \') AND V_COMPARE <= F_NLSSORT(\'攈 \') THEN
V_RETURN := V_RETURN || \'j\';
ELSIF V_COMPARE >= F_NLSSORT(\'咔 \') AND V_COMPARE <= F_NLSSORT(\'穒 \') THEN
V_RETURN := V_RETURN || \'k\';
ELSIF V_COMPARE >= F_NLSSORT(\'垃 \') AND V_COMPARE <= F_NLSSORT(\'擽 \') THEN
V_RETURN := V_RETURN || \'l\';
ELSIF V_COMPARE >= F_NLSSORT(\'嘸 \') AND V_COMPARE <= F_NLSSORT(\'椧 \') THEN
V_RETURN := V_RETURN || \'m\';
ELSIF V_COMPARE >= F_NLSSORT(\'拏 \') AND V_COMPARE <= F_NLSSORT(\'瘧 \') THEN
V_RETURN := V_RETURN || \'n\';
ELSIF V_COMPARE >= F_NLSSORT(\'筽 \') AND V_COMPARE <= F_NLSSORT(\'漚 \') THEN
V_RETURN := V_RETURN || \'o\';
ELSIF V_COMPARE >= F_NLSSORT(\'妑 \') AND V_COMPARE <= F_NLSSORT(\'曝 \') THEN
V_RETURN := V_RETURN || \'p\';
ELSIF V_COMPARE >= F_NLSSORT(\'七 \') AND V_COMPARE <= F_NLSSORT(\'裠 \') THEN
V_RETURN := V_RETURN || \'q\';
ELSIF V_COMPARE >= F_NLSSORT(\'亽 \') AND V_COMPARE <= F_NLSSORT(\'鶸 \') THEN
V_RETURN := V_RETURN || \'r\';
ELSIF V_COMPARE >= F_NLSSORT(\'仨 \') AND V_COMPARE <= F_NLSSORT(\'蜶 \') THEN
V_RETURN := V_RETURN || \'s\';
ELSIF V_COMPARE >= F_NLSSORT(\'侤 \') AND V_COMPARE <= F_NLSSORT(\'籜 \') THEN
V_RETURN := V_RETURN || \'t\';
ELSIF V_COMPARE >= F_NLSSORT(\'屲 \') AND V_COMPARE <= F_NLSSORT(\'鶩 \') THEN
V_RETURN := V_RETURN || \'w\';
ELSIF V_COMPARE >= F_NLSSORT(\'夕 \') AND V_COMPARE <= F_NLSSORT(\'鑂 \') THEN
V_RETURN := V_RETURN || \'x\';
ELSIF V_COMPARE >= F_NLSSORT(\'丫 \') AND V_COMPARE <= F_NLSSORT(\'韻 \') THEN
V_RETURN := V_RETURN || \'y\';
ELSIF V_COMPARE >= F_NLSSORT(\'帀 \') AND V_COMPARE <= F_NLSSORT(\'咗 \') THEN
V_RETURN := V_RETURN || \'z\';
END IF;
END LOOP;
RETURN V_RETURN;
END; 
测试一下:
SELECT F_TRANS_PINYIN_CAPITAL(\'王德封\') FROM DUAL   
返回首字母:wdf 。


--按笔画排序

01.select ChannelID,ChannelName from dbo.HB_AdChannel order by ChannelName collate chinese_prc_stroke_cs_as_ks_ws
--按拼音排序

01.select ChannelID,ChannelName+Description from dbo.HB_AdChannel order by ChannelName+Description collate chinese_prc_cs_as_ks_ws
 --sql如何让中文名字按 名字第一个字的拼音首字母排序

 select isnull(b.py,upper(left(a.username,1))) as py,a.username
from (
select \'a3\' as username
union select \'中华人民共和国\'
union select \'周笔畅\'
union select \'郭安俊\'
union select \'天堂\'
union select \'包振\'
union select \'魔兽\'
union select \'精灵\'
union select \'安全第一\'
)
a
left outer join (
select \'A\' as PY,N\'驁\' as word, N\'啊\' as sword
union select \'B\',N\'簿\',N\'驁\'
union select \'C\',N\'錯\',N\'簿\'
union select \'D\',N\'鵽\',N\'錯\'
union select \'E\',N\'樲\',N\'鵽\'
union select \'F\',N\'鰒\',N\'樲\'
union select \'G\',N\'腂\',N\'鰒\'
union select \'H\',N\'夻\',N\'腂\'
union select \'J\',N\'攈\',N\'夻\'
union select \'K\',N\'穒\',N\'攈\'
union select \'L\',N\'鱳\',N\'穒\'
union select \'M\',N\'旀\',N\'鱳\'
union select \'N\',N\'桛\',N\'旀\'
union select \'O\',N\'漚\',N\'桛\'
union select \'P\',N\'曝\',N\'漚\'
union select \'Q\',N\'囕\',N\'曝\'
union select \'R\',N\'鶸\',N\'囕\'
union select \'S\',N\'蜶\',N\'鶸\'
union select \'T\',N\'籜\',N\'蜶\'
union select \'W\',N\'鶩\',N\'籜\'
union select \'X\',N\'鑂\',N\'鶩\'
union select \'Y\',N\'韻\',N\'鑂\'
union select \'Z\',N\'咗\',N\'韻\'
) b on left(username,1) between b.sword and b.word

本文由长沙做网站整理,转载请注明www.sendawangluo.com

分类:

技术点:

相关文章: