【问题标题】:PostgreSQL WHERE IN LIKE queryPostgreSQL WHERE IN LIKE 查询
【发布时间】:2016-10-30 14:36:32
【问题描述】:

我想知道是否可以使用 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%')

【问题讨论】:

    标签: sql database postgresql


    【解决方案1】:

    使用 SIMILAR TO 而不是 LIKE

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

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

    【讨论】:

    • 这个答案解决了我的问题,但如果 SIMILAR TO 可以用单选项和多选项做到这一点,那么为什么有人会使用 LIKE?
    • @Trent SIMILAR TO 在后台使用正则表达式。所以我希望它可能比LIKE 工作得慢。但我不认为这是你的情况
    【解决方案2】:

    其实在PostgreSQL中使用something IN (<value list>)类似于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%'])
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-03-03
          • 2022-01-21
          • 2016-11-06
          • 2021-02-20
          • 2014-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-17
          相关资源
          最近更新 更多