在sql server中,如何检查字段是否包含超出特定范围的字符?

yhuiod9q  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(276)

我正在尝试编写一个查询来检查nvarchar字段中的单个字符是否超出有效范围。
我认为这样的查询可以工作,但结果包含两行,而不是只包含无效的一行:

select foo
from (
    select N'ABDC' as foo
    union all 
    select N'ABǼC' as foo
) as bar
where bar.foo like '%[^ -~]%' COLLATE SQL_Latin1_General_Cp1_CS_AS

有效范围是ascii空格和颚化符中的任何内容。
一个更简单的例子也失败了:

select foo
from (
    select N'ABDC' as foo
    union all 
    select N'ABzC' as foo
) as bar
where bar.foo like '%[^A-Z]%' COLLATE SQL_Latin1_General_Cp1_CS_AS

这将不返回任何结果,而返回正确的行:

select foo
from (
    select N'ABDC' as foo
    union all 
    select N'AB~C' as foo
) as bar
where bar.foo like '%[^A-Z]%' COLLATE SQL_Latin1_General_Cp1_CS_AS

下面是一个简单的例子:http://sqlfiddle.com/#!18/9eecb/93202号
我做错了什么?

vcirk6k6

vcirk6k61#

基于这个答案,我可以使用like来完成这项工作:

select foo
from (
    select N'ABDC' as foo
    union all 
    select N'ABǼC' as foo
) as bar
where bar.foo COLLATE Latin1_General_BIN like N'%[^ -~]%' COLLATE Latin1_General_BIN

看起来我只是需要一个不同的排序。
同样,这也适用:

select foo
from (
    select N'ABDC' as foo
    union all 
    select N'ABǼC' as foo
) as bar
where patindex('%[^ -~]%' COLLATE Latin1_General_BIN,bar.foo) > 0

相关问题