Как сделать условный порядок по заявлению с несколькими типами данных, SQL оракул? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытался это сделать, но мои типы данных: char и дата

select * from table_name   
    where
    smthng 
    order by  
    case when to_date(to_char( :edate, 'dd.mm.yyyy'),'dd.mm.yyyy')-
    to_date(to_char( :sdate, 'dd.mm.yyyy'),'dd.mm.yyyy')>0  
    then ddate   
    else  department end

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вам не нужно преобразование для вычитания, учитывая, что :edate и :sdate имеют дату типа

select *
  from table_name
 where smthng
 order by case
            when :edate - :sdate > 0 then
             to_char(ddate ,'dd.mm.yyyy')
            else
             department
            end
0 голосов
/ 26 февраля 2019

Все выходные данные оператора 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;
0 голосов
/ 26 февраля 2019

Значение в порядке должно соответствовать типу данных, поэтому, если вам не удается вернуть дату или строку, но только один тип данных. A8ssuming департамент является типом данных strint, вам следует преобразовать данные в виде символов)

select * 
from table_name   
where .......   smthng .... 
order by  
  case when to_date(to_char( :edate, 'dd.mm.yyyy'),'dd.mm.yyyy')-
    to_date(to_char( :sdate, 'dd.mm.yyyy'),'dd.mm.yyyy')>0  
    then to_char(ddate ,    'dd.mm.yyyy')
 else  department
  end
...