首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2个where条件之间的差异看起来相似

2个where条件之间的差异看起来相似
EN

Stack Overflow用户
提问于 2021-01-14 19:54:08
回答 2查看 60关注 0票数 0

当我看到这两个where条件时,我的大脑是盲目的,我不能理解其中的区别。有人能给我解释一下吗?第一个返回273条记录,第二个返回93条记录。我想他们应该还回同样的记录。

第一个

代码语言:javascript
复制
    s.value LIKE '%One Travel%'
    OR s.value LIKE '%One RSA%'
    OR s.value LIKE '%One Other%'
    OR s.value LIKE '%GP&U%'
    OR s.value = ' '

第二位

代码语言:javascript
复制
    s.value LIKE (
    '%One Travel%'
    ,'%One RSA%'
    ,'%One Other%'
    ,'%GP&U%'
    , ' ')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-15 17:51:37

第二个命令中的LIKE不是一个函数,它实际上是相同的LIKE谓词。但是它的右侧参数被指定为行值。

我猜很多数据库管理系统都会抛出错误,但H2会尝试将此处的所有值转换为字符串,这在极少数情况下是有用的,但在这种情况下就没有用了。

代码语言:javascript
复制
something LIKE (
    '%One Travel%'
    ,'%One RSA%'
    ,'%One Other%'
    ,'%GP&U%'
    , ' ')`

变成了

代码语言:javascript
复制
something LIKE 'ROW (%One Travel%, %One RSA%, %One Other%, %GP&U%,  )'

在最新版本的H2或

代码语言:javascript
复制
something LIKE '(%One Travel%, %One RSA%, %One Other%, %GP&U%,  )'

在旧版本中(它们不支持行值,但它们将这样的表达式视为非标准数组)。

这两个表达式都是没有意义的。您需要将第一个命令与多个OR条件一起使用。或者,您可以将复杂正则表达式与非标准REGEXP运算符(类似于LIKE语法)或非标准REGEXP_LIKE函数一起使用。

实际上,VALUE是一个关键字,所以H2不能执行这两个命令(至少在它的最新版本中是这样),但我假设它只是一个实际列名的替换。

票数 0
EN

Stack Overflow用户

发布于 2021-01-14 22:23:09

我根本不知道H2,但我假设第二个查询的计算结果为:

代码语言:javascript
复制
s.value LIKE '%One Travel%'
    OR s.value LIKE '%One RSA%'
    OR s.value LIKE '%One Other%'
    OR s.value LIKE '%GP&U%'
    OR s.value LIKE ' '

所以只剩下s.value = ' 's.value LIKE ' '之间的区别了。显然,H2遵循ANSI SQL,ANSI标准在比较时忽略了尾随空格(实际上,要比较的字符串是用空格填充的,直到它们的长度相同)。因此,对于' 's.value = ' '返回TRUE,对于''' '也是如此。LIKE不填充空格进行比较,因为它用于模式匹配而不是相等测试。因此,LIKE ' '只匹配一个空格。

简而言之,您的第一个查询将返回更多行,因为还会返回value为空字符串或多个空格的行。第二个查询只返回value为单个空格的行(为简单起见,忽略其他条件)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65718488

复制
相关文章

相似问题

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