4
select status_a,status_b from test 

如何使用 oracle 解码函数 a 解码以下值status_a以及status_bstatus_a 或 status_b 的值之一是否为空。

if  status_a='Y' and status_b='Y' then 'Y'

if  status_a='Y' and status_b='N' then 'N'

if  status_a='N' and status_b='Y' then 'N'

if  status_a='N' and status_b='N' then 'N'

问候,

柴图哈拉

4

3 回答 3

7

为什么要使用DECODECASE看起来更合适

CASE WHEN status_a = 'Y' and status_b = 'Y' THEN 'Y'
     WHEN status_a = 'Y' and status_b = 'N' THEN 'N'
     WHEN status_a = 'N' and status_b = 'Y' THEN 'N'
     WHEN status_a = 'N' and status_b = 'N' THEN 'N'
  END

当然,您发布的逻辑似乎没有意义。status_a = 'Y' or status_b = 'Y'在评估为 TRUE时评估为 FALSE的唯一方法status_a = 'Y' or status_b = 'N'是 ifstatus_a = 'N'status_b = 'N'。但这意味着永远无法到达第三和第四分支。如果您的意思是and而不是or,那么逻辑将是有意义的。但在这种情况下,您可以将其简化为

CASE WHEN status_a = 'Y' and status_b = 'Y' THEN 'Y'
     ELSE 'N'
  END
于 2013-09-05T21:38:55.703 回答
2

如果您的意思是 AND 而不是 OR,那么这可以使用解码来完成:

decode(status_a,'Y',
       decode(status_b,'Y','Y','N'),
       'N')

或者这可以简化为:

decode(status_a||status_b,'YY','Y','N')
于 2013-09-05T21:40:14.480 回答
0

根据您的最后评论,我猜,您是说任何一个值都是 Y,那么结果应该是 Y,并且如果其中一个为空,那么它也应该是 Y。

我希望下面的解码可以很好地满足您的要求。

decode(status_a||Status_b,'YY','Y','YN','Y,'NY','Y','NN','N','Y')
于 2013-09-05T23:56:16.810 回答