PostgreSQL WHERE IN LIKE查询

时间:2016-06-28 10:10:42

标签: 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%'
)

有没有办法替换

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

4 个答案:

答案 0 :(得分:10)

使用 SIMILAR TO 代替 LIKE

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

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

答案 1 :(得分:4)

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

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

还有一个额外的好处:它可以作为客户端应用程序的参数传递。

答案 2 :(得分:3)

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

=实际上可以被任何二元运算符替换。因此,您可以使用:

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

答案 3 :(得分:1)

MySQL 或 Oracle 的用户可能会发现它有点不同,但在 PostGreSQL 中,使用 LIKE 子句过滤数据,应该使用类似 -

select * from table-name where column-name::text like '%whatever-to-be-searched%'