【问题标题】:How to match '0', '00', '000', '0000' ... pattern in TSQL?如何在 SQL 中匹配“0”、“00”、“000”、“0000”...模式?
【发布时间】:2014-10-30 05:55:07
【问题描述】:

我可以用什么语句代替下面的查询?

Select  *
        From   Customer.dbo.Human
        Where  LTrim(RTrim(Mobile)) In ('0', '00', '000', '0000', ....)

【问题讨论】:

    标签: sql-server tsql sql-like


    【解决方案1】:

    假设您要匹配完全由零和空格组成且至少包含一个零的手机号码。

    那么以下将是一种方式..

    WHERE Mobile LIKE '%0%' AND Mobile NOT LIKE '%[^ 0]%'
    

    【讨论】:

    • 这些也会匹配空字符串,不是吗?
    • @Twinkles - 是的。眼下。我怀疑这是所需的功能。将编辑。
    【解决方案2】:
    Where Len(Mobile) - Len(Replace(Mobile, '0', '')) = Len(Mobile)
    

    【讨论】:

    • 为什么不Where Len(Replace(Mobile, '0', '')) = 0
    【解决方案3】:
    select *
    from Customer.dbo.Human
    where CHARINDEX(Mobile, '0') > 0
    

    这里有一些技巧。单个“0”恰好包含在您的所有其他案例中,因此它可以工作,因为“0”包含在“000”中

    强调 - 这是一个糟糕的模式。它会错误地识别任何带有零的字符串。搜索值不是有效的主键或类型化属性标识符的任何 CharIndex 搜索都是危险的模式。即如果您不能使用 IN('SpecificValue1','SpecificValue2') 则退后一步重新评估。

    我希望的解决方案是不插入未通过验证的值,在清理例程期间插入或更新时,所有看起来为零的字符串都将转换为 null 或空字符串。

    【讨论】:

    • 尽管 OP 接受了这一点,但我怀疑它是否会成为所需要的。该模式似乎是“完全由零组成”而不仅仅是“包含零”
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2021-11-16
    相关资源
    最近更新 更多