我有一个场景,我需要检查日期和值以确定结果。
实施例 -
case when my_date > '10-01-2011' and my_value = 0 then
'Do this'
else
'Do that'
end
我正在尝试在oracle SQL查询中使用它,我想知道是否有更好的方法来处理这种逻辑而不是使用case语句;也许使用解码或任何其他oracle函数。
答案 0 :(得分:4)
CASE
是SQL中条件逻辑的ANSI SQL标准。因此,您的代码很好,除了字符串'10 -01-2011',您将其隐式处理为日期。我会使用ANSI DATE
文字格式:
case when my_date > date '2011-01-10' and my_value = 0 then
'Do this'
else
'Do that'
end
DECODE
是Oracle在CASE
可用之前对条件SQL的专有解决方案。可以使用DECODE
表示相同的逻辑:
decode (my_value,
0, decode (sign (my_date - date '2011-01-10'),
1,
'Do this',
'Do that'),
'Do that')
不是很优雅或可读吗?它还使用SIGN
函数,该函数返回1表示正数,-1表示负数,0表示0表示。
另请注意,CASE
可用于PL / SQL,而DECODE
则不能。
-- This works
myvar := case when x=1 then 'a' else 'b' end;
-- This doesn't
myvar := decode (x, 1, 'a', 'b');