【问题标题】:LIKE with case sensitive wildcardsLIKE 带有区分大小写的通配符
【发布时间】:2018-02-20 09:19:23
【问题描述】:

我有以下查询:

SELECT *
FROM sys.objects AS O
WHERE O.is_ms_shipped = 0
AND O.name LIKE '%[A-Z][A-Z][A-Z]%' COLLATE Latin1_General_CS_AS;

这应该找到数据库中至少有三个连续大写字符的所有对象,但是它似乎不起作用,我不确定为什么。我试图明确列出所有字符而不是指定范围,但它没有解决问题。

样本数据:

name
---------
HTMLTable
HtmlTable

期望的输出:

name
---------
HTMLTable

【问题讨论】:

    标签: sql-server sql-server-2016


    【解决方案1】:

    试试这个:

    LIKE '%[A-Z][A-Z][A-Z]%' COLLATE Latin1_General_Bin
    

    【讨论】:

    • 这样好多了。我认为排序规则是问题所在,并且它错误地解释了范围?
    • @EvaldasBuinauskas 是的。 Latin1_General_CS_AS 仍然按字母顺序对字母进行排序。所以,在'AaBbCc...' 的顺序中编辑:还要注意,这里也会出现带重音符号的字符。 因此,在你的LIKE 表达式中,唯一的无效字符是'z'。此处提供给您的排序规则也将字母按大小写顺序排列:'ABCDE...abcde...',因此您的 LIKE 可以按您现在的需要工作。
    【解决方案2】:

    下面的代码应该可以工作 -

    SELECT name
    FROM sys.objects AS O
    WHERE O.is_ms_shipped = 0
    AND O.name LIKE '%[ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]%' COLLATE Latin1_General_CS_AS;
    

    【讨论】:

    • 奇怪的是,这行得通。我只是想知道为什么当我自己明确列出这些角色时它没有成功。无论如何,这很棒!
    • 我的猜测 - 正则表达式 [A-Z] 不区分大小写,即使您指定了排序顺序
    • Latin1_General_Bin 进行整理即使在t-clausen.dk 建议的范围内也能很好地工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2014-10-17
    • 2013-09-22
    • 2015-04-14
    相关资源
    最近更新 更多