postgreSQL:IN运算符与多个OR



有一种行为我想永远理解。

查询#1:

SELECT count(id) FROM table WHERE message like '%TEXT1%'   

输出:504

查询#2

SELECT count(distinct id) FROM table WHERE message like '%TEXT2%'   

输出:87

查询#3

SELECT count(distinct id) FROM table WHERE message in ('%TEXT1%','%TEXT2%' )

输出:0

我想了解为什么我在第三个查询中得到零。基于此,( , )等效于多重OR。这不包括OR吗?

( , )等价于多个OR。这不包括OR吗?

当然,它是包容性的。但这仍然是一个相等的比较,没有通配符匹配。这就像写

WHERE (message = '%TEXT1%' or message = '%TEXT2%')

而不是

WHERE (message LIKE '%TEXT1%' or message LIKE '%TEXT2%')

IN不接受通配符。它们是LIKE特有的。

所以,你需要使用:

WHERE message like '%TEXT1%'  OR message like '%TEST2%'

或者,您可以使用正则表达式:

WHERE message ~ 'TEXT1|TEXT2'

IN检查其左侧的值是否等于列表中的任何值。它不支持模式匹配。

这种行为是标准的ANSI SQL,在Postgres文档中也有描述:

expression IN (value [, ...])

右侧是一个带括号的标量表达式列表。如果左侧表达式的结果等于任何右侧表达式,则结果为"true"。这是的简写符号

expression = value1 OR expression = value2 OR ...

因此,如果您想与几种可能的模式匹配,您需要OR:

where message like '%TEXT1%' or message like '%TEST2%'

最新更新