3

我正在尝试在单个 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 post SQL IN 子句中的多列我创建了一个这样的查询查询

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

4

3 回答 3

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

于 2013-08-01T12:41:23.823 回答
1

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

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

于 2013-08-01T05:17:28.527 回答
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
)
于 2013-08-01T13:05:16.153 回答