在SQL Server中,LIKE操作符的工作不如预期

3

我有以下SQL查询:

select
    zz.teststring TEST_STRING
    ,case when zz.teststring like 'JA%' then 'true' else 'false' end [JA%]
    ,case when zz.teststring like 'J%' then 'true' else 'false' end [J%]
    ,case when zz.teststring like 'JAA%' then 'true' else 'false' end [JAA%]
from 
    (select 'jaa' teststring) zz

这将输出

TEST_STRING      JA%       J%       JAA%
jaa              false     true     true

大小写不影响结果。

如果有人能够解释为什么JA%返回false,我会非常感激。


1
MSSql不区分大小写。 - HaveNoDisplayName
2
@HaveNoDisplayName 不是很准确,数据库、表和列可以使用区分大小写的排序规则。 - Lamak
1
在 sqlfiddle 上它返回了预期的结果。 - Jens
2
我只能获得3个真或3个假,这取决于排序规则。你使用的是哪种排序规则? - Jakub Lortz
1
@JakubLortz 请尝试使用 COLLATE Danish_Norwegian_CI_AI,http://sqlfiddle.com/#!6/9eecb7/3195/0 - Lukasz Szozda
1个回答

4

您需要检查排序规则是否设置为区分大小写:

演示

select
zz.teststring TEST_STRING
,case when zz.teststring like 'JA%' then 'true' else 'false' end [JA%]
,case when zz.teststring like 'J%' then 'true' else 'false' end [J%]
,case when zz.teststring like 'JAA%' then 'true' else 'false' end [JAA%]
from (
    select 'jaa' teststring
) zz

对于不区分大小写的情况,请添加COLLATE Latin1_General_CI_AS

select
zz.teststring TEST_STRING
,case when zz.teststring like 'JA%'  COLLATE Latin1_General_CI_AS then 'true' else 'false' end [JA%]
,case when zz.teststring like 'J%' COLLATE Latin1_General_CI_AS then 'true' else 'false' end [J%]
,case when zz.teststring like 'JAA%' COLLATE Latin1_General_CI_AS then 'true' else 'false' end [JAA%]
from (
    select 'jaa' teststring
) zz

编辑:

但我想知道你是如何得出答案 false, true, true 的:

演示2

select
zz.teststring TEST_STRING
,case when zz.teststring like 'JA%' then 'true' else 'false' end [JA%]
,case when zz.teststring like 'J%' then 'true' else 'false' end [J%]
,case when zz.teststring like 'JAA%' then 'true' else 'false' end [JAA%]
from (
    select 'jaa' COLLATE Latin1_General_CS_AS teststring
) zz

感谢jarlh,谜团解开了:

COLLATE Danish_Norwegian_CI_AI

演示3

在某些语言中,“aa”被视为一个字符。


1
太棒了!没有想到那一点。 - Nilzone-
2
有些编程语言把aa视为一个字符。 - jarlh
@jarlh 感谢你的建议,我使用“COLLATE Danish_Norwegian_CI_AI”重新创建了这个案例。很高兴学到了新东西。 - Lukasz Szozda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接