SQL判断某列中是否包含中文字符、英文字符、纯数字
方法一、包含中文字符
select * from 表名 where 列名 like '%[吖-座]%'
[吖-座]是中文字符集第一个到最后一个的范围,虽然匹配准确,但是用Like的效率很低
在使用mysql时候,某些字段会存储中文字符,或是包含中文字符的串,查询出来的方法是:
SELECT column FROM table WHERE length(column)!=char_length(column)
原理其实很简单,当字符集为UTF-8,并且字符为中文时,length() 和 char_length() 两个方法返回的结果是不相同的。
二、包含英文字符
select * from 表名 where 列名 like '%[a-z]%' or like '%[A-Z]%'
或者
select * from 表名 where 列名 like '%[a-Z]%'
三、包含纯数字
select * from 表名 where 列名 like '%[0-9]%'
方法二:通配符。高逼格使用。(类似C#的正则表达式,适用场景:2005及以上(2005之前的版本没试过,应该也支持))
--返回0-则为纯数字(支持正负数,小数点)
SELECT PATINDEX('%[^0-9|.|-|+]%','2.2')--返回0
--返回0-则为纯整数
select PATINDEX('%[^0-9]%', '2.2') --返回 非0的位置
四、从sqlserver中提取数据截取字符
1、LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0;
2、POSITION(substr IN str ):返回子串substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,与LOCATE函数作用相同;
3、LEFT(str, length):从左边开始截取str,length是截取的长度;
4、RIGHT(str, length):从右边开始截取str,length是截取的长度;
5、SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出现位置之前的字符串;
6、SUBSTRING(str ,n ,m):返回字符串str从第n个字符截取到第m个字符;
7、REPLACE(str, n, m):将字符串str中的n字符替换成m字符;
8、LENGTH(str):计算字符串str的长度。
是否包含中文基本原理:字符的 unicode编码范围。
0~9 : 48~57
A~Z :65 ~ 90
a~z : 97~ 122
汉字unicode编码范围:[0x4e00,0x9fa5](或十进制[19968,40869])
SELECT * FROM dbo.person WHERE UNICODE(字段) BETWEEN 19968 AND 40869
判断字符串中含有中文:
SELECT * FROM tb WHERE PATINDEX('%[啊-座]%',FieldName)>0
或: SELECT * FROM tb WHERE PATINDEX('%[吖-座]%',FieldName)>0
注意:N’%[吖-座]%’ 不适用于英文版或国外的SQLServer环境。 (<0 不含中文)
通用性最好的还是 UNICODE(字段) BETWEEN 19968 AND 40869 ,但不好做判断
-- 判断是否不含中文
IF( select top(1) PATINDEX(N'%[吖-座]%',Description) From ZZZ_Aegis_ADSN ) <=0
select 1
else
select 0
/* 判断是否包含中文,并把是否含中文作为条件来执行一些操作 */
IF( select top(1) PATINDEX('%[吖-座]%',ApplyName) From [B_00TEST] ) >0
select 1
else select 0
--这个不能作为IF的条件,只能查询到具体信息
SELECT top(1) * FROM [B_00TEST] WHERE PATINDEX(N'%[吖-座]%',ApplyName) <=0
IF( UNICODE(N'啊111') BETWEEN 19968 AND 40869 ) select 1 else select 0
IF( UNICODE(N'Abc111') BETWEEN 19968 AND 40869 ) select 1 else select 0 --中文''前面要加N
通配符:[]
> FieldName like '[a-zA-Z]%' --------- ([]指定值的范围)
> FieldName like '[^F-M]%' --------- (^排除指定范围)