2013-08-01 2 views
3

Я пытаюсь реализовать запрос с несколькими столбцами в одном условии. Но это делает ошибку sql.
Мой первоначальный запрос, как этотSQL несколько столбцов в одном состоянии WHERE

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

ответ

1

В то время как другой пост показывает вам, как сделать IN запрос с несколькими столбцами, это не означает, что можно с другими операторами, такими как BETWEEN.

Насколько я знаю, единственный способ добиться того, что вы хотите, как вы показываете в начале вашего вопроса, с 3-мя BETWEEN заявления :(Отстой Я знаю, но это SQL

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

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 
)