2016-06-28 145 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 ...)