导航:首页 > 净水问答 > oracle过滤函数

oracle过滤函数

发布时间:2023-01-19 02:55:31

Ⅰ ORACLE中怎样用正则表达式过滤中文字符

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以GB2312为例, 写一函数准确地从表里提取简体汉字.

假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的

那么也就是汉字是双字节的,且简体汉字的编码范围是
B0A1 - F7FE
换算成10进制就是
B0 A1 F7 FE
176,161 - 247,254

我们先看一下asciistr函数的定义
Non-ASCII characters are converted to the form \xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以 "\" 开始的字符就是汉字了

举例如下
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;

NAME ASCIISTR(NAME)
-------------------- ----------------------
,啊OO10哈 ,\554AOO10\54C8
你好aa \4F60\597Daa
大家好aa/ \5927\5BB6\597Daa/
☆大海123 \2606\5927\6D77123
★ABC \2605ABC

我们看到最后一条记录的实心五角星也是 "\"开头的
此时我们就不能用asciistr(字段)是否存在 "\" 来判断是否含有汉字了.

我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内
[PHP]
create or replace function get_chinese(p_name in varchar2) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(mp(p_name,1010),instrb(mp(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from al where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
return v_chinese;
else
return '';
end if;
end;
/
.
[/PHP]

好,现在来执行一些语句
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

5 rows selected.

1. 列出有汉字的记录
SQL> select name from test where length(get_chinese(name))>0;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123

4 rows selected.

2. 列出有汉字的记录,并且只列出汉字

SQL> select get_chinese(name) from test where length(get_chinese(name))>0;

GET_CHINESE(NAME)
---------------------------------------------------------------------------
啊哈
你好
大家好
大海

4 rows selected.

需要说明的是GB2312共有6763个汉字,即72*94-5=6763
我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去
============

改写这个函数,可以提取非汉字或者汉字
该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字

[PHP]
create or replace function get_chinese
(
p_name in varchar2,
p_chinese in varchar2
) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_non_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(mp(p_name,1010),instrb(mp(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from al where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
if p_chinese = '1' then
return v_chinese;
else
return v_non_chinese;
end if;
else
return '';
end if;
end;
/

.
[/PHP]
SQL> select * from a;

NAME
--------------------
我们啊、
他(艾呀)是★们
他的\啊@

SQL> select get_chinese(name,1) from a;

GET_CHINESE(NAME,1)
-----------------------------------------
我们啊
他艾呀是们
他的啊

SQL> select get_chinese(name,0) from a;

GET_CHINESE(NAME,0)
-----------------------------------------

()★
\@

SQL>

Ⅱ oracle中能去掉数据前后空格的函数是什么

selecttrim('aaa')fromal;


selectLtrim('aaa')fromal;


selectRtrim('aaa')fromal;


selectRtrim(Ltrim('aaa'))fromal。

Ⅲ oracle 里使用any 函数过滤参数时需要处理大小写,但加上upper函数后就不能工作了 请问如何结合使用

语句贴出来啊

Ⅳ oracle 中的几个常用函数

Oracle常用函数:

  1. Substr截取函数

  2. Distinct去除重复函数

  3. Having一般与groupby公用的限制语句他不与单个值有关而是与组有关

  4. Innerjoin……on内连接语句

  5. Abs取绝对值的函数SelectAsb(-100)fromal

  6. mod取余函数

  7. sign返回数的符号正为10为0负为-1

  8. cell(n)返回>=n的最小整数要求n必须是十进制的数

  9. sort(n)返回n的平方根当n小于0是返回nanPower(n1,n2)返回n1的n2次幂Exp(n)返回e的n次幂

  10. LOG(n1,n2)返回以n1为底n2的对数n1不为0,1Ln(n)返回n的自然对数n不为0,1

  11. ASCII(char)返回参数首字母的ASCII码值

  12. lengtch(char)返回字符串char的长度

  13. substr(‘给定的字符串’,A,B)A表示从第几位开始截B表示截几位,如果A为负值从右边数到A位开始向后截B位

  14. cast数据类型转换函数

  15. chartorowid函数将char类型转换为ROWID类型但是最后长度必须满足rowid的标准18位

  16. Rowidtochar函数将rowid类型转换为char因为rowid长度为18,故转换成的字符串也是18位。

  17. to_char(number)将数字类型转换成字符类型To_char(data) 将日期转换成字符型

  18. lnnvl(条件)排除条件得到指定条件之外的函数

  19. nvl(expr1,expr2)如果expr1为null则返回expr2否则返回expr1

Ⅳ oracle中的procere中trim,upper函数和decode函数有什么不同

decode函数有参数

trim函数过滤掉字符串的空格,
upper函数将字符串转为大写
decode函数: DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。
需要注意的是,这里的if、then及else 都可以是函数或计算表达式。

Ⅵ 如何优化Oracle在where条件中用了自定义函

Oracle的自定义函数,提供了对逻辑的封装能力,便于我们对代码进行管理。然而当这个函数出现在where语句中,它却很可能给我们的SQL语句带来严重的效率问题。因为:
1、Oracle的优化器无法对函数进行优化,只能逐行执行(这就是为什么我们常发现,把函数里面的语句拷出来,就会执行得很快的原因)
2、函数并非标准SQL所包含的东西,因此Oracle在执行函数时,会频繁在SQL上下文和PL/SQL上下文之间切换。当数据量大时,就会增加CPU和内存的消耗,降低语句执行的效率。
因此,自定义函数,就像一把双刃剑一样,摆在了我们面前。对此,我们有以下几种对策:
1、不用函数
2、借用Oracle的缓存机制
3、函数索引
1)不用函数。不用函数确实能解决问题,但如果一段逻辑会被很多个SQL语句用到,这就会给我们的代码管理带来了很大的麻烦。因此这是万不得已的下下策。当然,没必要使用函数的地方,可以尽量避免。
2)借用Oracle的缓存机制。
Oracle对子查询,是会做缓存处理的。因此我们可以把函数写在一个子查询中,如把“my_func(id)”变成“(select my_func(id) from al)”。这样做可以通过缓存,减少函数被调用的次数,从而提高效率。通常用函数对大数据量进行过滤时,此方法都可大量降低函数被调用的次数(可从Oracle的执行统计看出)
另一种方法,就是对函数强行开启结果缓存。方法是在函数的return类型之后,加上“result_cache”标记。
3)使用函数索引。首先该函数必须被标记为deterministic,即在函数的return类型之后,加上“deterministic”标记。它表示当函数的输入值是确定时,返回结果必定是唯一的。此后,在表的列上新建索引,索引列不是写列名,而是写“my_func(id)”这样即可。
通常地,我推荐先尝试“子查询缓存”这种方法。因为它不仅对函数、表本身没有作任何修改,而且效果也比较明显。我曾经试过对一条很复杂的SQL做了这种处理,结果执行效率提高了60倍之多!如果缓存效果不明显时,可以再尝试下函数索引。不过我发现同样的SQL,我只加函数索引的话,效果并不如“子查询缓存”那样立竿见影。
注意,以上提到的,都只是一些调优的手段而已,并非一定能解决问题。所以可以的话,我们还是要尽量避免把函数放在where语句中。

Ⅶ oracle sQL 过滤定义怎样写

你要查询的目标是???

Ⅷ oracle 自定义函数处理‘过滤掉空格和其他特殊字符函数’怎么写

用regexp_replace这个函数根据正则表达式将特殊字符替换成空串

Ⅸ Oracle中使用to_number()函数,里面有文字怎么解决

你好!
你可以通过过滤,把有文字的数据过滤掉!
文字过滤的话,可能需要用到正则表达式了!
如果不会的话,采纳本问题,新开设问题提问一下!
给你解决!
望采纳!

Ⅹ oracle的条件后面可以把两个字段拼起来过滤吗 就是能不能用concat函数啊

可以的,其实没必要用concat,直接用||就可以了。

阅读全文

与oracle过滤函数相关的资料

热点内容
浩泽厨上净水器怎么样 浏览:150
三星空气净化器怎么拆开 浏览:143
污水处理化验室监测方法 浏览:841
RO膜出来的水PH值 浏览:852
奶瓶消毒锅水垢有毒吗 浏览:617
用厨房里的什么除水垢 浏览:595
江西宿舍污水处理设备哪里卖 浏览:151
现代汽车怎么样换空调滤芯 浏览:327
树脂切割片红片与黑片区别 浏览:135
小米净化器显示屏数字分别是什么意思 浏览:302
世界上的污水源 浏览:580
树脂模具厂家联系电话 浏览:352
超滤产水压力低是什么原因 浏览:777
tea在污水中代表什么 浏览:789
龙头净水器能除水垢 浏览:698
家里如何提取纯净水 浏览:534
曼牌空气滤芯怎么拆卸 浏览:511
汽油滤芯什么是内置式和外置式 浏览:32
成都40寸滤芯哪里有 浏览:924
净水机怎么拆鹅颈 浏览:786