【问题标题】:In SQL Server, how can I check if a field contains a character outside of a specific range?在 SQL Server 中,如何检查字段是否包含特定范围之外的字符?
【发布时间】:2020-11-20 09:08:08
【问题描述】:

我正在尝试编写一个查询来检查 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

我做错了什么?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    我能够使用基于this answer 的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多