有一种行为我想永远理解。
查询#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%'