我在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)
为什么第一个代码示例给出正确答案,第二个例子不是?
我试图找到答案,但没有运气。感谢解释。
答案 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))