T-SQL,查找数值

时间:2015-11-08 14:12:12

标签: sql-server

我在http://www.sql-ex.ru/上做了这个测验,确切地说是问题35。

问题如下: 在“产品”表中,确定仅包含数字或仅包含拉丁字母的模型(A-Z,不区分大小写)。 结果集:模型,模型类型。

我给出了正确答案:

SELECT model,
       type
FROM   Product
WHERE  Model NOT LIKE '%[^A-Z]%'
        OR Model NOT LIKE '%[^0-9]%' 

现在我的问题是为什么我需要双重否定来使其发挥作用。 如果我将代码重写为:

SELECT model,
       type
FROM   Product
WHERE  Model LIKE '%[A-Z]%'
        OR Model LIKE '%[0-9]%' 

我得错了答案: 您的查询在第一个(可用)数据库上返回了正确的数据集,但它在第二个检查数据库上返回了不正确的数据集。 *错误的记录数量(更多37)

为什么第一个代码示例给出正确答案,第二个例子不是?

我试图找到答案,但没有运气。感谢解释。

1 个答案:

答案 0 :(得分:6)

 Where Model LIKE '%[A-Z]%' Or Model LIKE '%[0-9]%'

匹配Model包含至少一个字母数字字符的行。

这不会以任何方式排除包含混合字母数字和非字母数字字符的值。

e.g。由于~A#-

的存在,A会通过

此外,您的正确查询与

匹配
  • '%[^A-Z]%':那些不包含任何非字母的字符串(即只包含字母或为空)
  • '%[^0-9]%':那些不包含任何非数字的字符串(即只包含数字或为空)。

在您的第二次尝试中根本不会处理此问题,并且会接受混合的字母和数字字符串。

我会使用你的第一次尝试,但如果你决定避免双重否定,你可以使用

SELECT model
FROM   Product
WHERE  Model LIKE REPLICATE('[A-Z]', LEN(Model))
        OR Model LIKE REPLICATE('[0-9]', LEN(Model))