postgreSQL在单个WHERE条件中包含多个列



我正试图在一个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的重复。在in子句中的另一个SO post SQL多列中,我创建了一个类似的查询查询

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

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

据我所知,实现你想要的东西的唯一方法是你在问题开始时展示的方式,用3条BETWEEN语句:(我知道很糟糕,但那是SQL

如果有人在这里寻找一个在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

就像我认为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
)

相关内容

  • 没有找到相关文章

最新更新