2016-06-28 93 views
5

我想知道是否有可能使用IN子句进行查询,其中的选项是LIKE子句,例如我有我的现有SQL返回相同的结果,因为我打算它看起来像关于如何做的一个圆。PostgreSQL在哪里查询

SELECT * 
FROM pg_stat_activity 
WHERE application_name NOT LIKE '%psql%' 
AND (current_timestamp - state_change) > INTERVAL '30 minutes' 
AND state IN (
    SELECT state 
    FROM pg_stat_activity 
    WHERE state LIKE '%idle%' 
    OR state LIKE '%disabled%' 
) 

有没有一种方法,其中沿着

SELECT * 
FROM pg_stat_activity 
WHERE application_name NOT LIKE '%psql%' 
AND (current_timestamp - state_change) > INTERVAL '30 minutes' 
AND state IN ('%idle%', '%disabled%') 

回答

3

使用行类似的东西TO,而不是取代LIKE

AND state SIMILAR TO '%(idle|disabled)%'

https://www.postgresql.org/docs/9.0/static/functions-matching.html

+0

这个回答解决了我的问题,但如果有类似的可以用奇异期权和多种选择,那么为什么会有人曾经使用LIKE做到这一点? – Trent

+0

@Trent'SIMILAR TO'在引擎盖下使用正则表达式。所以我期望它可能比'LIKE'慢。但我不认为这是你的情况 – Arsen

3

实际使用something IN (<value list>)类似于something = any(array[<value list>]) PostgreSQL的:

postgres=# explain select 1 where 'a' in ('a','b','c'); 
         QUERY PLAN       
---------------------------------------------------------- 
Result (cost=0.00..0.01 rows=1 width=0) 
    One-Time Filter: ('a'::text = ANY ('{a,b,c}'::text[])) 
(2 rows) 

幸运的是我们可以使用like或者甚至ilike代替=

select 1 where 'aa' ilike any(array['%A%','%B%','%C%']); 
?column? 
---------- 
     1 
(1 row) 

所以你的情况可能是

... state LIKE ANY(ARRAY['%idle%', '%disabled%']) 

另外一个dvantage:它可以作为客户端应用程序的参数传递。

+0

哈,我输入太慢了。 –

+0

@CraigRinger看来,我们都失去了:o) – Abelisto

2

x IN (a, b)可以简写为x = ANY (ARRAY[a,b])。同样,x IN (SELECT ...)x = ANY (SELECT ...)

=实际上可以被任何二元运算符取代。因此,你可以使用:

SELECT ... WHERE x LIKE ANY (SELECT ...)