2016-06-28 25 views
5

Zastanawiam się, czy możliwe jest wykonanie kwerendy przy użyciu klauzuli IN, gdzie opcje wewnątrz niej są klauzulami LIKE, na przykład mam istniejący SQL, który zwraca te same wyniki, co mam zamiar po prostu wydaje się jak runda o tym, jak to zrobić.PostgreSQL GDZIE W JAK PODEJMOWAĆ zapytanie

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

Czy istnieje sposób, aby zastąpić czymś wzdłuż linii

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

Odpowiedz

3

użytkowania podobny do zamiast LIKE

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

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

+0

Ta odpowiedź rozwiązała mój problem, ale jeśli PODOBNE TO może to zrobić z opcjami w liczbie pojedynczej i wieloma opcjami, dlaczego ktoś miałby używać LIKE? – Trent

+0

@Trent 'PODOBNE DO' używa regex pod maską. Tak więc spodziewam się, że może działać wolniej niż "LIKE". Ale nie sądzę, że to twoja sprawa. – Arsen

3

rzeczywiście przy something IN (<value list>) jest podobna do something = any(array[<value list>]) w 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) 

szczęście możemy użyć like lub nawet ilike zamiast =:

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

Więc w twoim przypadku może to być

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

I dodatkowe dvantage: może być przekazany jako parametr z aplikacji klienckiej.

+0

Ha, mówię zbyt wolno. –

+0

@CraigRinger I wydaje się, że oboje straciliśmy: o) – Abelisto

2

x IN (a, b) może być zastrzeżonym skrótem dla x = ANY (ARRAY[a,b]). Podobnie, x IN (SELECT ...) i .

W rzeczywistości może zostać zastąpiony dowolnym operatorem binarnym. W ten sposób można użyć:

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