我试图这样做,但是我的数据类型是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
答案 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