• sqlserver6


    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之前的版本没试过,应该也支持))

    1. --返回0-则为纯数字(支持正负数,小数点)
    2. SELECT PATINDEX('%[^0-9|.|-|+]%','2.2')--返回0
    3. --返回0-则为纯整数
    4. select PATINDEX('%[^0-9]%', '2.2') --返回 非0的位置

    四、从sqlserver中提取数据截取字符

    1. 1、LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0
    2. 2、POSITION(substr IN str ):返回子串substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,与LOCATE函数作用相同;
    3. 3LEFT(str, length):从左边开始截取str,length是截取的长度;
    4. 4RIGHT(str, length):从右边开始截取str,length是截取的长度;
    5. 5、SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出现位置之前的字符串;
    6. 6、SUBSTRING(str ,n ,m):返回字符串str从第n个字符截取到第m个字符;
    7. 7REPLACE(str, n, m):将字符串str中的n字符替换成m字符;
    8. 8LENGTH(str):计算字符串str的长度。

    是否包含中文基本原理:字符的 unicode编码范围。

    1. 09 : 4857
    2. A~Z :65 ~ 90
    3. a~z : 97~ 122

    汉字unicode编码范围:[0x4e00,0x9fa5](或十进制[19968,40869])

    SELECT * FROM dbo.person  WHERE UNICODE(字段) BETWEEN 19968 AND 40869
    

    判断字符串中含有中文:

    1. SELECT * FROM tb WHERE PATINDEX('%[啊-座]%',FieldName)>0
    2. 或: SELECT * FROM tb WHERE PATINDEX('%[吖-座]%',FieldName)>0

    注意:N’%[吖-座]%’ 不适用于英文版或国外的SQLServer环境。 (<0 不含中文)
    通用性最好的还是 UNICODE(字段) BETWEEN 19968 AND 40869 ,但不好做判断

    1. -- 判断是否不含中文
    2. IF( select top(1) PATINDEX(N'%[吖-座]%',Description) From ZZZ_Aegis_ADSN ) <=0
    3. select 1
    4. else
    5. select 0
    6. /* 判断是否包含中文,并把是否含中文作为条件来执行一些操作 */
    7. IF( select top(1) PATINDEX('%[吖-座]%',ApplyName) From [B_00TEST] ) >0
    8. select 1
    9. else select 0
    10. --这个不能作为IF的条件,只能查询到具体信息
    11. SELECT top(1) * FROM [B_00TEST] WHERE PATINDEX(N'%[吖-座]%',ApplyName) <=0
    12. IF( UNICODE(N'啊111') BETWEEN 19968 AND 40869 ) select 1 else select 0
    13. IF( UNICODE(N'Abc111') BETWEEN 19968 AND 40869 ) select 1 else select 0 --中文''前面要加N


    通配符:[]

    > FieldName like '[a-zA-Z]%'  --------- ([]指定值的范围) 
    > FieldName like  '[^F-M]%'    --------- (^排除指定范围)
     

  • 相关阅读:
    静态方法、类方法
    C++新特性 | bind & function
    PyTorch - 模型训练损失 (Loss) NaN 问题的解决方案
    python开发api接口框架
    Visual Studio C++ Hello World
    面试真题:消费者积压问题的答案
    9.0 HashMap底层原理及部分源码分析
    IDC_ISP网络之IDC机房内网络架构及配置
    黑马JVM总结(十六)
    安装VMware
  • 原文地址:https://blog.csdn.net/qq_26695613/article/details/134292226