您当前的位置:首页 > 互联网教程

oracle中怎么判断查询的列中是否包含字母

发布时间:2025-05-23 20:18:38    发布人:远客网络

oracle中怎么判断查询的列中是否包含字母

一、oracle中怎么判断查询的列中是否包含字母

selectcasewhenregexp_like(字段名,.([a-z]+|[A-Z]))then包含字母else不包含字母end

关键的参数是第二个:.([a-z]+|[A-Z])其中.表示匹配任何单字符,换行符除外

[a-z]是小写字母|或[A-Z]大写字母。

1、程序不仅需要给计算机读,也要给程序员读。程序设计风格的原则,代码应该清楚的和简单的,具有直截了当的逻辑,自然的表达式,通行的语言使用方式,有意义的名字和帮助作用和注释。

2、自定义类型名以大写字母开头,各单词之间以大写字母分隔,如CallType(即骆驼式命名法)。变量名以小写字母开头,各单词之间以大写字母分隔(变量活动范围前缀以下划线分隔),如m_pReleaseIn。函数名以大写字母开头,各单词之间以大写字母分隔(进程、进程页及子函数前缀以下划线分隔),如Sub_ErrorDealing。

3、命名宏定义时,表示最大个数时定义为XXX_MAX_NUM(如最大子节点个数可用SNODE_MAX_NUM表示),表示最大取值时定义为XXX_MAX(如PT板E1的最大取值可用PT_E1_MAX表示)。定义最小个数时定义为XXX_MIN_NUM,定义最小取值时定义为XXX_MIN。(以防止下标使用时难以分辨是否需要减1)

二、oracle正则表达式 查询value中只包含任何中文和数字的记录.

用regexp_like这个函数来解决,正则表达式为:[[:punct:]]+这个正则可以找出任何标点符号。查询value中包含任何标点符号的记录如下:select*fromxxxwhereregexp_like(value,'[[:punct:]]+');POSIX正则表达式由标准的元字符(metacharacters)所构成:'$'匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配'\n'或'\r'。'?'匹配前面的子表达式零次或一次。'*'匹配前面的子表达式零次或多次。'|'指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的'()'标记一个子表达式的开始和结束位置。'{m,n}'一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。\num匹配num,其中num是一个正整数。对所获取的匹配的引用。[[:alpha:]]任何字母。[[:digit:]]任何数字。[[:alnum:]]任何字母和数字。[[:space:]]任何白字符。[[:upper:]]任何大写字母。[[:lower:]]任何小写字母。[[:punct:]]任何标点符号。[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]。\转义符*,+,?,{n},{n,},{n,m}限定符^,$,anymetacharacter位置和顺序。

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

从表里提取汉字,需要考虑字符集,不同的字符集汉字的编码有所不同

这里以GB2312为例,写一函数准确地从表里提取简体汉字.

假设数据库字符集编码是GB2312,环境变量(注册表或其它)的字符集也是GB2312编码

并且保存到表里的汉字也都是GB2312编码的

那么也就是汉字是双字节的,且简体汉字的编码范围是

我们先看一下asciistr函数的定义

Non-ASCII characters are converted to the form\xxxx, where xxxx represents a UTF-16 code unit.

但是这并不表示以"\"开始的字符就是汉字了

这里第5条记录有一个实心的五角星

然后用asciistr函数转换一下试试

SQL> select name,asciistr(name) from test;

------------------------------------------

,啊OO10哈,\554AOO10\54C8

大家好aa/\5927\5BB6\597Daa/

☆大海123\2606\5927\6D77123

我们看到最后一条记录的实心五角星也是"\"开头的

此时我们就不能用asciistr(字段)是否存在"\"来判断是否含有汉字了.

我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内

create or replace function get_chinese(p_name in varchar2) return varchar2

v_code varchar2(30000):='';

v_chinese varchar2(4000):='';

select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:','') into v_code from dual 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);

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

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

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

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

---------------------------------------------------------------------------

需要说明的是GB2312共有6763个汉字,即72*94-5=6763

我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去

改写这个函数,可以提取非汉字或者汉字

该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字

create or replace function get_chinese

v_code varchar2(30000):='';

v_chinese varchar2(4000):='';

v_non_chinese varchar2(4000):='';

select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:','') into v_code from dual 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);

v_non_chinese:= v_non_chinese||substr(p_name,i,1);

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

v_non_chinese:= v_non_chinese||substr(p_name,i,1);

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

if p_chinese='1' then

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

-----------------------------------------

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

-----------------------------------------