在解码

时间:2017-08-15 09:41:09

标签: sql oracle case decode

我有一个场景,我需要检查日期和值以确定结果。

实施例 -

case when my_date > '10-01-2011' and my_value = 0 then
'Do this'
else 
'Do that'
end

我正在尝试在oracle SQL查询中使用它,我想知道是否有更好的方法来处理这种逻辑而不是使用case语句;也许使用解码或任何其他oracle函数。

1 个答案:

答案 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');