单个WHERE条件中的SQL多列

时间:2013-08-01 04:59:34

标签: sql postgresql postgresql-8.4

我正在尝试在单个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

3 个答案:

答案 0 :(得分:1)

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

据我所知,通过3个BETWEEN语句实现你在问题开头显示的方式达到你想要的唯一方法:(糟透了我知道,但那是SQL

答案 1 :(得分:1)

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

答案 2 :(得分:0)

正如我认为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
)