pl sql 数据库存的汉字, 怎么根据拼音的首字母查询

详细如下:

ID pactname
1 上海机构
2 北京机构
3 山西机构
4 湖北机构

我现在在想要查询pactname的第一个字母是 S 的,就可以把“ 上海机构
”“ 陕西机构
”查询出来,sql怎么写?

7个回答

创建一个根据汉字获取拼音的oracle 方法,然后在SQL语句中先将汉字翻译成拼音,再用模糊匹配查询就可以了。

[code="sql"]
CREATE OR REPLACE FUNCTION get_pinyin(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';
else
V_RETURN := V_RETURN || replace(replace(SUBSTR(P_NAME, I, 1),'',''),'·','');
END IF;
END LOOP;
RETURN V_RETURN;
END;

[/code]

[code="sql"]
select * from tbl where get_pinyin(pactname) like 's%'
[/code]

建议在存储时存储它的拼音 使用pinyin4j完成转换

liuiu1
liuiu1 哦,明白你的意思呢? 我上面的脚本 要怎么变成 pl_sql语法呢 ,先把这个效果做出来 ,
接近 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 我的建议就是在保存时一起保存pinyin
接近 7 年之前 回复
liuiu1
liuiu1 那我到底 该怎么样呢?
接近 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 用这东西 数据量大了 搞死你
接近 7 年之前 回复
liuiu1
liuiu1 --2. 汉字首字母查询处理用户定义函数 CREATE FUNCTION f_GetPY(@str nvarchar(4000)) RETURNS nvarchar(4000) AS BEGIN DECLARE @py TABLE( ch char(1), hz1 nchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS, hz2 nchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS) INSERT @py SELECT 'A',N'吖',N'鏊' UNION ALL SELECT 'B',N'八',N'簿' UNION ALL SELECT 'C',N'嚓',N'错' UNION ALL SELECT 'D',N'哒',N'跺' UNION ALL SELECT 'E',N'屙',N'贰' UNION ALL SELECT 'F',N'发',N'馥' UNION ALL SELECT 'G',N'旮',N'过' UNION ALL SELECT 'H',N'铪',N'蠖' UNION ALL SELECT 'J',N'丌',N'竣' UNION ALL SELECT 'K',N'咔',N'廓' UNION ALL SELECT 'L',N'垃',N'雒' UNION ALL SELECT 'M',N'妈',N'穆' UNION ALL SELECT 'N',N'拿',N'糯' UNION ALL SELECT 'O',N'噢',N'沤' UNION ALL SELECT 'P',N'趴',N'曝' UNION ALL SELECT 'Q',N'七',N'群' UNION ALL SELECT 'R',N'蚺',N'箬' UNION ALL SELECT 'S',N'仨',N'锁' UNION ALL SELECT 'T',N'他',N'箨' UNION ALL SELECT 'W',N'哇',N'鋈' UNION ALL SELECT 'X',N'夕',N'蕈' UNION ALL SELECT 'Y',N'丫',N'蕴' UNION ALL SELECT 'Z',N'匝',N'做' DECLARE @i int SET @i=PATINDEX('%[吖-做]%' COLLATE Chinese_PRC_CS_AS_KS_WS,@str) WHILE @i>0 SELECT @str=REPLACE(@str,SUBSTRING(@str,@i,1),ch) ,@i=PATINDEX('%[吖-做]%' COLLATE Chinese_PRC_CS_AS_KS_WS,@str) FROM @py WHERE SUBSTRING(@str,@i,1) BETWEEN hz1 AND hz2 RETURN(@str) END GO 这一段代码是 sqlserver声明变量的 ,我现在是PL_SQL要怎么改 ,谢谢
接近 7 年之前 回复
liuiu1
liuiu1 还有没其它的办法 ,这个存储到数据库有的时间花费比较大,数据比较多
接近 7 年之前 回复
witcheryne
witcheryne 用过ruby下的gems: chinese_pinyin
接近 7 年之前 回复
nimasike
温故而知新666 正解,存数据的时候就把拼音同时存到数据库当中
接近 7 年之前 回复

你可以考虑增加一个字段zjm,使用助记码:例如:上海机构的助记码为:shjg,北京机构:bjjg,陕西机构:sxjg等,这样你就可以查询zjm的第一个字母为s的就可以把上海机构和山西机构查询出来了

liuiu1
liuiu1 不能增加字段呢 ,还有什么其他的办法
接近 7 年之前 回复

select * from order by nlssort(<字段名>,'NLS_SORT=SCHINESE_PINYIN_M');

liuiu1
liuiu1 我是要根据 首字母 查询出结果 ,不是排序
接近 7 年之前 回复

select * from order by nlssort(pactname,'NLS_SORT=SCHINESE_PINYIN_M');

liuiu1
liuiu1 我是要根据 首字母 查询出结果 ,不是排序
接近 7 年之前 回复

最好新建一个字段用来保存pactname的首字母。

0 select * from order by nlssort(<字段名>,'NLS_SORT=SCHINESE_PINYIN_M');

这个好使不?

liuiu1
liuiu1 这个是拼音排序, 俺是要拼音查询
接近 7 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!