首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >-SQL,查找数值

-SQL,查找数值
EN

Stack Overflow用户
提问于 2015-11-08 14:12:11
回答 1查看 292关注 0票数 6

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

问题如下:在Product中,确定仅由数字组成或仅由拉丁字母组成的模型(A,大小写不敏感)。结果集:模型,模型类型。

我给出了正确的答案:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT model,
       type
FROM   Product
WHERE  Model NOT LIKE '%[^A-Z]%'
        OR Model NOT LIKE '%[^0-9]%' 

现在我的问题是,为什么我需要双重否定才能让它发挥作用。如果我将代码重写为:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT model,
       type
FROM   Product
WHERE  Model LIKE '%[A-Z]%'
        OR Model LIKE '%[0-9]%' 

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

为什么第一个代码示例给出了正确的答案,而第二个例子却没有?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-08 14:14:26

代码语言:javascript
代码运行次数:0
运行
复制
 Where Model LIKE '%[A-Z]%' Or Model LIKE '%[0-9]%'

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

这绝不排除那些包含混合字母数字和非字母数字字符的值。

~A#-会通过,因为A的存在

此外,正确的查询与

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

在您的第二次尝试中,这是完全没有处理的,并且一个混合的字母和数字字符串将被接受。

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

代码语言:javascript
代码运行次数:0
运行
复制
SELECT model
FROM   Product
WHERE  Model LIKE REPLICATE('[A-Z]', LEN(Model))
        OR Model LIKE REPLICATE('[0-9]', LEN(Model)) 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33594890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档