当我看到这两个where条件时,我的大脑是盲目的,我不能理解其中的区别。有人能给我解释一下吗?第一个返回273条记录,第二个返回93条记录。我想他们应该还回同样的记录。
第一个
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 = ' '第二位
s.value LIKE (
'%One Travel%'
,'%One RSA%'
,'%One Other%'
,'%GP&U%'
, ' ')发布于 2021-01-15 17:51:37
第二个命令中的LIKE不是一个函数,它实际上是相同的LIKE谓词。但是它的右侧参数被指定为行值。
我猜很多数据库管理系统都会抛出错误,但H2会尝试将此处的所有值转换为字符串,这在极少数情况下是有用的,但在这种情况下就没有用了。
something LIKE (
'%One Travel%'
,'%One RSA%'
,'%One Other%'
,'%GP&U%'
, ' ')`变成了
something LIKE 'ROW (%One Travel%, %One RSA%, %One Other%, %GP&U%, )'在最新版本的H2或
something LIKE '(%One Travel%, %One RSA%, %One Other%, %GP&U%, )'在旧版本中(它们不支持行值,但它们将这样的表达式视为非标准数组)。
这两个表达式都是没有意义的。您需要将第一个命令与多个OR条件一起使用。或者,您可以将复杂正则表达式与非标准REGEXP运算符(类似于LIKE语法)或非标准REGEXP_LIKE函数一起使用。
实际上,VALUE是一个关键字,所以H2不能执行这两个命令(至少在它的最新版本中是这样),但我假设它只是一个实际列名的替换。
发布于 2021-01-14 22:23:09
我根本不知道H2,但我假设第二个查询的计算结果为:
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为单个空格的行(为简单起见,忽略其他条件)。
https://stackoverflow.com/questions/65718488
复制相似问题