2013-09-05 2 views
1
select status_a,status_b from test 

как декодировать status_a, status_b ниже значений, используя функцию оракула декодирования а и, если одно из значений status_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' 

С уважением,

Chaituhara

+0

Вы или «заявления должны быть« и »? Я не думаю, что это имеет смысл, поскольку это, например, if status_a = 'Y' и status_b = 'N', если результатом будет «Y» или «N»? Обе ваши первые две строки будут верны для этого сценария. – ChrisProsser

ответ

5

Почему вы хотите использовать DECODE? CASE казалось бы, гораздо лучше подходят

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' оценивал значение FALSE, а status_a = 'Y' or status_b = 'N', оцененный в TRUE, был бы равен status_a = 'N' и status_b = 'N'. Но это означает, что третья и четвертая ветви никогда не будут достигнуты. Если вы имели в виду and, а не or, логика имела бы смысл. Но в этом случае, вы могли бы упростить его

CASE WHEN status_a = 'Y' and status_b = 'Y' THEN 'Y' 
    ELSE 'N' 
    END 
+0

Спасибо, Как я могу сделать это с помощью инструкции Decode – user2750658

+0

Я изменил 'или' на 'и', чтобы соответствовать OP. –

+0

@ пользователь2750658. , , Зачем вам нужно использовать 'decode()' вместо более мощного и стандартного выражения 'case'? –

2

Если вы имеете в виду и вместо OR, то это может быть сделано с помощью расшифровывает:

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

или это может быть упрощена:

decode(status_a||status_b,'YY','Y','N') 
+0

благодарит chris, как это работает, если одно из значений либо status_a, либо значение status_b равно null – user2750658

+0

@ user2750658 Я ожидаю, что это будет оценено до 'N'. К сожалению, я не на компьютере, где я могу проверить это прямо сейчас. Если бы это было не так, тогда это можно было бы обработать с помощью nvl, но это меня удивило бы. Вы хотите, чтобы это оценивалось как «N»? – ChrisProsser

+0

нет, это должно быть «Y» – user2750658

0

На основании вашего последнего комментария Я предполагаю, что вы говорите, что любое значение Y, тогда результат должен быть Y, а также в случае, если один из них равен нулю, а также должен быть Y.

Надеюсь, что ниже декодирование прекрасно работает в соответствии с вашими требованиями.

decode(status_a||Status_b,'YY','Y','YN','Y,'NY','Y','NN','N','Y') 
+0

извините, что оно не работает – user2750658

+0

могу ли я знать ошибка, является ли она логической или синтаксической? Это помогает мне повторить попытку. –