The*_*age 12 sql database postgresql
我想知道是否可以使用IN子句进行查询,其中的选项是LIKE子句,例如我有我现有的SQL返回相同的结果,因为我打算它似乎是一个圆形的方法来做到这一点.
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%'
)
Run Code Online (Sandbox Code Playgroud)
有没有办法取代某些东西
SELECT *
FROM pg_stat_activity
WHERE application_name NOT LIKE '%psql%'
AND (current_timestamp - state_change) > INTERVAL '30 minutes'
AND state IN ('%idle%', '%disabled%')
Run Code Online (Sandbox Code Playgroud)
Ars*_*sen 11
使用SIMILAR TO而不是LIKE
AND state SIMILAR TO '%(idle|disabled)%'
https://www.postgresql.org/docs/9.0/static/functions-matching.html
x IN (a, b)可以被认为是 的简写x = ANY (ARRAY[a,b])。同样,x IN (SELECT ...)和x = ANY (SELECT ...)。
该=实际上可通过任何二进制运算符来代替。因此,您可以使用:
SELECT ... WHERE x LIKE ANY (SELECT ...)
Run Code Online (Sandbox Code Playgroud)
实际使用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)
Run Code Online (Sandbox Code Playgroud)
幸运的是,我们可以使用like甚至ilike代替=:
select 1 where 'aa' ilike any(array['%A%','%B%','%C%']);
?column?
----------
1
(1 row)
Run Code Online (Sandbox Code Playgroud)
所以你的情况可能是
... state LIKE ANY(ARRAY['%idle%', '%disabled%'])
Run Code Online (Sandbox Code Playgroud)
另一个好处是:它可以作为参数从客户端应用程序传递。