【问题标题】:Repeating characters in T-SQL LIKE conditionT-SQL LIKE 条件中的重复字符
【发布时间】:2012-08-28 02:10:03
【问题描述】:

问题:
VARCHAR 变量(或列)的值限制为数字和 ASCI 字符,但允许可变长度。
此脚本不会产生所需的结果:

declare @var as VARCHAR (150)
select @var = '123ABC'

if (@var LIKE '[a-zA-Z0-9]{0,150}')
    print 'OK'
else
    print 'Not OK'  

有人知道怎么做吗?

【问题讨论】:

    标签: sql sql-server tsql sql-like


    【解决方案1】:

    T-SQL 不支持正则表达式,最接近的是 PATINDEX 函数,可用于匹配特定字符,但不能指定计数。 您可以尝试将其与LEN 函数结合使用来检查长度。

    有关PATINDEX 的一些示例,请参见this 页面。

    【讨论】:

      【解决方案2】:

      这有帮助吗

      Declare @t table (Alphanumeric VARCHAR(100))
      Insert Into @t 
      Select '123ABCD' Union All Select 'ABC' Union All 
      Select '123'  Union All  Select  '123ABCý' Union All
      Select 'a-z123' Union All  Select 'abc123' Union All
      Select 'a1b2c3d4'
      
      
      SELECT Alphanumeric
      FROM @t 
      WHERE Alphanumeric LIKE '%[a-zA-Z0-9]%' 
      AND ( Alphanumeric NOT LIKE  '%[^0-9a-zA-Z]%' COLLATE Latin1_General_BIN) 
      AND LEN(Alphanumeric)> 6 -- display records having more than a length of 6
      

      //结果

      字母数字

      123ABCD
      a1b2c3d4
      

      N.B.~ 使用了 Martin 的整理提示..谢谢

      【讨论】:

        【解决方案3】:

        您可以使用 not carat ^ 和 NOT LIKE 表达式来做到这一点。

        所以你说,哪里不像不是非字母数字;)这适用于标准数字和字符:

        declare @var as VARCHAR (150)
        select @var = '123ABC'
        
        if (@var NOT LIKE '%[^a-zA-Z0-9]%')
            print 'OK'
        else
            print 'Not OK'
        

        编辑:感谢 Martin 的排序提示,如果您希望像 ý 这样的字符被视为非字母数字,请在 COLLATE 中添加如下

        declare @var as VARCHAR (150)
        select @var = '123ABCý'
        
        if (@var NOT LIKE '%[^a-zA-Z0-9]%' COLLATE Latin1_General_BIN ) 
            print 'OK'
        else
            print 'Not OK'  
        

        【讨论】:

        • 您可能还需要一个二进制整理子句。没有它,它可以返回额外的字符SELECT number, CHAR(number) FROM master..spt_values WHERE type='P' AND number between 0 and 255 and CHAR(number) NOT LIKE '%[^a-z^A-Z^0-9]%'
        • @MartinSmith 谢谢,没有考虑过奇怪的字符,当我几年前不得不这样做时,它们并没有出现在我身上,但他们可以为提问者。非常感谢。
        • 模式也需要是NOT LIKE '%[^a-zA-Z0-9]%'。没有那个插入符匹配。有了它,前面的查询按预期返回了 62 行。
        • @MartinSmith 再次感谢,已修复。我的话你有很多观点:)
        • 只是另一件事...知道如何用特殊字符 ([]%^*) 扩展允许的字符列表吗?如何组合插入符号 (^) 和 ESCAPE 字符?非常感谢。
        【解决方案4】:

        T-SQL 不支持正则表达式。

        你可以使用SQL CLR来运行这样的表达式。


        也可以试试LEN 函数:

        if (LEN(@var) <= 150)
            print 'OK'
        else
            print 'Not OK'  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-22
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多