Выражение case внутри предложения where — Oracle

У меня есть столбец дат, который имеет 2 разных формата данных: гггг-мм-дд и дд/мм/гггг. Из-за этого мне нужно определить формат даты, чтобы я мог преобразовать их в правильный формат. Мой SQL-запрос выглядит следующим образом:

select *
from teste
where
    (CASE
        WHEN data like '%-%' THEN
            TO_DATE(data, 'yyyy-mm-dd') BETWEEN
            TO_DATE(01/01/2000, 'dd/mm/yyyy') AND 
            TO_DATE(01/01/2016, 'dd/mm/yyyy')
        ELSE
            TO_DATE(data, 'dd/mm/yyyy') BETWEEN 
            TO_DATE(01/01/2000, 'dd/mm/yyyy') AND 
            TO_DATE(01/01/2016, 'dd/mm/yyyy')
    END)

Выполняя это, я получаю сообщение об ошибке: 00905. 00000 - "отсутствует ключевое слово" *Причина:
*Действие: Ошибка в строке: 6 Столбец: 35.

Кажется, что есть проблема в предложении между. Может ли кто-нибудь помочь мне с этим?


person Bruno Camargo    schedule 07.12.2015    source источник
comment
Бесполезно упоминать, но теперь вы знаете, почему вам никогда не следует хранить даты в виде строки.   -  person Wernfried Domscheit    schedule 07.12.2015
comment
Проблема в том, что не я создал таблицу и не вставляю данные в БД.   -  person Bruno Camargo    schedule 07.12.2015


Ответы (1)


Выражение CASE возвращает вам некоторое значение. И вы должны сравнить это значение с чем-то. Вы не можете поместить целое выражение в CASE.

E.g.

select *
from teste
where
    CASE WHEN data like '%-%' THEN
      TO_DATE(data, 'yyyy-mm-dd') 
    ELSE
      TO_DATE(data, 'dd/mm/yyyy') 
    END 
  BETWEEN  TO_DATE(01/01/2000, 'dd/mm/yyyy') AND 
            TO_DATE(01/01/2016, 'dd/mm/yyyy')
person Tatiana    schedule 07.12.2015
comment
Большое спасибо, это сработало! Кроме того, мне нужно упорядочить даты в порядке по пункту. Как я могу применить ту же логику в этом? - person Bruno Camargo; 07.12.2015