Все выходные данные оператора CASE
должны иметь одинаковый тип данных, и, поскольку вы не можете преобразовать department
в DATE
тип данных, вам необходимо преобразовать ddate
в строку илиеще есть два CASE
оператора со взаимоисключающими условиями.
Некоторые дополнительные пункты:
- Во-первых, вам не нужно конвертировать
:sdate
и :edate
из DATE
тип данных в строку, а затем обратно в DATE
;просто выполните сравнение для DATE
s. - Во-вторых, когда вы делаете это в предложении
ORDER BY
, вам необходимо убедиться, что то, что вы упорядочиваете, имеет смысл.Упорядочивание по дате, отформатированной как строка 'dd.mm.yyyy'
, не имеет смысла, поскольку будет выполнять сравнение буквенно-цифровых строк, а не сравнение в порядке возрастания дат.Если вы хотите использовать один оператор case и преобразовать оба в строки, используйте формат ISO 8601 YYYY-MM-DD
, который позволит вам упорядочить форматированную строку даты, используя алфавитно-цифровую сортировку.
Likeэто:
SELECT *
FROM table_name
WHERE something
ORDER BY
CASE
WHEN :edate > :sdate
THEN TO_CHAR( ddate ,'YYYY-MM-DD' )
ELSE department
END
или вы можете просто использовать 2 CASE
операторов, по одному для каждого взаимоисключающего случая и по умолчанию каждый равен NULL
(или некоторой другой константе), когда он не совпадает:
SELECT *
FROM table_name
WHERE something
ORDER BY
CASE WHEN :edate > :sdate THEN ddate ELSE NULL END,
CASE WHEN :edate > :sdate THEN NULL ELSE department END;