在解码中使用 AND 条件

Fir*_*ame 1 sql oracle decode case

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

前任-

case when my_date > '10-01-2011' and my_value = 0 then
'Do this'
else 
'Do that'
end
Run Code Online (Sandbox Code Playgroud)

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

Ton*_*ews 5

CASE是 SQL 中条件逻辑的 ANSI SQL 标准。因此,您的代码很好,除了您隐式视为日期的字符串 '10-01-2011' 。我会为此使用 ANSIDATE文字格式:

case when my_date > date '2011-01-10' and my_value = 0 then
  'Do this'
else 
  'Do that'
end
Run Code Online (Sandbox Code Playgroud)

DECODE之前是 Oracle 针对条件 SQL 的专有解决方案CASE。可以用DECODE这样的方式表达相同的逻辑:

decode (my_value,
        0, decode (sign (my_date - date '2011-01-10'), 
                   1, 
                   'Do this',
                   'Do that'),
        'Do that')
Run Code Online (Sandbox Code Playgroud)

不是很优雅或可读吗?它还使用该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');
Run Code Online (Sandbox Code Playgroud)