2 where 条件看起来相似的区别

Differene between 2 where conditions which looks similar

当我看到这 2 个 where 条件时,我的头脑是盲目的,我不明白有什么区别。 有人可以解释一下吗?第一个 returns 273 条记录,第二个 returns 93。我认为他们应该 return 相同的记录。

第一

    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%'
    , ' ')

我根本不知道 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 标准在比较中忽略尾随 space(实际上要比较的字符串用 space 填充,直到它们的长度相同)。所以 s.value = ' ' returns ' ' 为真,''' ' 也为真。 LIKE 不会填充 space 进行比较,因为它用于模式匹配而不是相等性测试。因此,LIKE ' ' 仅匹配单个 space.

简而言之;您的第一个查询 returns 更多行,因为 value 是空字符串或多个 space 的行也被返回。您的第二个查询 returns 仅 value 是单个 space 的行(为简单起见忽略其他条件)。

第二个命令中的

LIKE 不是函数,它实际上是同一个 LIKE 谓词。但其右侧参数指定为行值。

我猜很多 DBMS 都会抛出错误,但 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 执行(至少它的最新版本是这样),但我认为它只是替换了一个真实的列名。