sql-oracle-如何通过具有多种数据类型的语句按条件排序

时间:2019-02-26 10:18:02

标签: sql oracle oracle11g sql-order-by

我试图这样做,但是我的数据类型是char和date

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 :(得分:1)

考虑到: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

答案 1 :(得分:0)

顺序中的值必须与数据类型匹配,因此,如果您不需要返回日期或字符串,而仅返回单个数据类型,则A8ssuming部门为strint数据类型,应将数据转换为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 to_char(ddate ,    'dd.mm.yyyy')
 else  department
  end

答案 2 :(得分:0)

CASE语句的所有输出必须具有相同的数据类型,并且由于您无法将department转换为DATE数据类型,因此您将需要转换{ {1}}到一个字符串,否则将有两个具有互斥条件的ddate语句。

一些其他要点:

  • 首先,您无需将CASE数据类型的:sdate:edate转换为字符串,然后再转换为DATE;只需在DATE上执行比较即可。
  • 第二,当您在DATE子句中执行此操作时,需要确定所订购的内容是否合理。按格式为ORDER BY字符串的日期排序没有意义,因为它将执行字母数字字符串比较,而不是按升序顺序进行比较。如果确实要使用单个case语句并将它们都转换为字符串,请使用ISO 8601格式'dd.mm.yyyy',该格式可让您使用字母数字排序来排序格式化的日期字符串。

赞:

YYYY-MM-DD

或者您可以只使用2条SELECT * FROM table_name WHERE something ORDER BY CASE WHEN :edate > :sdate THEN TO_CHAR( ddate ,'YYYY-MM-DD' ) ELSE department END 语句,每种互斥情况分别使用一条,如果不匹配,则默认为CASE(或其他常数)。

NULL