PostgreSQL中的WHERE-IN-LIKE查询

PostgreSQL中的WHERE-IN-LIKE查询,sql,database,postgresql,Sql,Database,Postgresql,我想知道是否可以使用IN子句进行查询,其中的选项类似于子句,例如,我有一个现有的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

我想知道是否可以使用IN子句进行查询,其中的选项类似于子句,例如,我有一个现有的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%')

使用类似于的而不是类似的

和类似于“%(空闲|禁用)%”的状态


在()中实际使用
某物类似于PostgreSQL中的
something=any(array[])

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%'])
另外一个优点是:它可以作为一个参数从客户端应用程序中传递。

x在(a,b)
中可以被看作是
x=ANY(数组[a,b])
的简写。类似地,
x IN(选择…
x=ANY(选择…

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

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

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

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

这个答案解决了我的问题,但如果类似于可以使用单数选项和多个选项,那么为什么有人会使用LIKE?@Trent
类似于使用regex。因此,我认为它可能比
之类的
工作得慢。但我不认为这是你的情况