【问题标题】:SQL multiple columns in single WHERE condition单个 WHERE 条件中的 SQL 多列
【发布时间】:2013-08-01 04:59:33
【问题描述】:

我正在尝试在单个 where 条件中实现包含多个列的查询。但它会产生一个 sql 错误。
我原来的查询是这样的

SELECT id 
FROM usertable 
WHERE (user_addedon BETWEEN '2013-07-02 00:00:01' AND '2013-08-01 23:59:59')
   OR (user_deletedon BETWEEN '2013-07-02 00:00:01' AND '2013-08-01 23:59:59')
   OR (user_modified BETWEEN '2013-07-02 00:00:01' AND '2013-08-01 23:59:59')

我想要做的是避免BETWEEN 的重复。从另一个 SO 帖子 SQL multiple columns in IN clause 我创建了一个这样的查询查询

SELECT id 
FROM usertable 
WHERE (user_addedon,user_deletedon,user_modifiedon) BETWEEN '2013-07-02 00:00:01' AND '2013-08-01 23:59:59'

但它显示错误ERROR: input of anonymous composite types is not implemented
是因为不能在PostgreSQL上实现还是查询有错误。
也想知道有没有其他方法可以实现这个?

我使用的是 PostgreSQL 8.4

【问题讨论】:

    标签: sql postgresql postgresql-8.4


    【解决方案1】:

    虽然另一篇文章向您展示了如何使用多列执行 IN 查询,但这并不表示可以使用其他运算符,例如 BETWEEN

    据我所知,以问题开头显示的方式实现您想要的唯一方法,使用 3 个 BETWEEN 语句 :( 我知道这很糟糕,但那是 SQL

    【讨论】:

      【解决方案2】:

      如果有人来到这里寻找适用于 9.2+ 的解决方案,日期范围类型可以做到这一点。此查询返回true

      select
          daterange'[2013-07-02, 2013-08-02)'
          @> any (array['2013-07-01', '2013-07-15', '2013-08-02']::date[])
      

      @> 运算符的意思是“范围包含元素”。 any 运算符的工作方式与in 非常相似。范围内的[ 表示包含范围,而) 表示排除。

      http://www.postgresql.org/docs/current/static/functions-range.html

      http://www.postgresql.org/docs/current/static/functions-comparisons.html#AEN18030

      http://www.postgresql.org/docs/current/static/rangetypes.html

      【讨论】:

        【解决方案3】:

        作为一个练习,我认为between 的列表更清晰

        select id 
        from usertable 
        where exists (
            select 1
            from
                (values (user_addedon, user_deletedon, user_modified)) ud(ud)
                cross join
                (values ('2013-07-02'::date, '2013-08-02'::date)) r(ri, re)
            where ud >= ri and ud < re
        )
        

        【讨论】:

          猜你喜欢
          • 2022-01-19
          • 2020-06-11
          • 1970-01-01
          • 1970-01-01
          • 2017-12-02
          • 2019-02-09
          • 2019-09-01
          • 2014-05-17
          • 2023-03-07
          相关资源
          最近更新 更多