我在http://www.sql-ex.ru/上做了这个小测验,确切地说,是第35题。
问题如下:在Product中,确定仅由数字组成或仅由拉丁字母组成的模型(A,大小写不敏感)。结果集:模型,模型类型。
我给出了正确的答案:
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倍以上)
为什么第一个代码示例给出了正确的答案,而第二个例子却没有?
我试图找到答案,但没有运气。感谢你的解释。
发布于 2015-11-08 06:14:26
Where Model LIKE '%[A-Z]%' Or Model LIKE '%[0-9]%'
匹配Model
至少包含一个alpha数字字符的行。
这绝不排除那些包含混合字母数字和非字母数字字符的值。
~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))
https://stackoverflow.com/questions/33594890
复制