Oracle——根据拼音首字母模糊查询某个字段

简介: Oracle——根据拼音首字母模糊查询某个字段

前言

Oracle数据库模糊查询数据,可以用like关键字;

但是,业务上有时候需要根据拼音首字母模糊查询某个字段,这时候考虑的点就比较多了

问题解决

解决方法有3种:


1. 表中添加一个字段表示拼音首字母

在表中增加一个字段,用于存储客户姓氏第一个字拼音的首字母。以后查询直接 name like  '%name%' 就OK了。 但是这样做的话不利于维护数据,而且业务上要求模糊查询的字段过多的话,需要添加更多的字段满足需求;


2.利用gb2312编码

利用gb2312的编码,比如以a开头的为 B0A1 到 B0C4 那么查询直接 select * from Table where substr(name,0,1) between 'B0A1' and 'B0C4'  就能直接把所需数据查询出来了。 不知此方法是否可行,因为现在数据库的编码是utf-8,不能适用


3.利用oracle 函数,将传入的姓名转成所需的姓氏拼音首字母

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 t.name from table_name t where f_trans_pinyin_capital(t.name) = 'ls';


参考文献:

[1].https://blog.csdn.net/wangheid/article/details/5288216

[2].https://www.cnblogs.com/telwanggs/p/6855491.html

相关文章
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
234 2
|
SQL Oracle 关系型数据库
Oracle之如何限制字段内数据的录入
Oracle之如何限制字段内数据的录入
151 0
|
4月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
4月前
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
|
4月前
|
存储 Oracle 关系型数据库
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
192 0
|
存储 Oracle 关系型数据库
oracle 过滤字段中的中文,不再洋不洋土不土
oracle 过滤字段中的中文,不再洋不洋土不土
277 0
|
存储 Oracle 安全
Oracle 12c的不可见字段:数据的“隐形斗篷”
【4月更文挑战第19天】Oracle 12c引入了不可见字段,这是一种隐藏数据列的特性,用于增强数据安全性和实现业务逻辑。不可见字段在常规查询中不显示,但参与数据操作,适合存储敏感信息或内部元数据。创建时只需在列定义中指定“INVISIBLE”属性。虽然有其限制,如特定查询可能暴露,但正确使用能有效提升数据安全性。了解和利用这一功能对数据管理员至关重要。
|
Oracle 关系型数据库 数据安全/隐私保护
oracle 19c 密码字段
oracle 19c 密码字段
109 0
|
存储 Oracle 关系型数据库
Oracle查询优化-提取姓名大写首字母缩写
【2月更文挑战第5天】【2月更文挑战第11篇】提取姓名大写首字母缩写
253 6