возвращение нескольких столбцов с использованием Case in Select Satement в Oracle - PullRequest
6 голосов
/ 31 марта 2009

У меня есть sceanrio, где мне нужно получить значения из разных подзапросов на основе условия в главном операторе выбора. Я пытался использовать Case, но проблема в том, что Case не поддерживает несколько столбцов. Есть ли способ обойти это или есть какой-то другой способ добиться этого?

Мой сценарий в упрощенном запросе

select col1,col2,
case when col3='E01089001' then 
        (select 1,3 from dual)
    else
        (select 2,4 from dual)
end
from Table1
where col1='A0529';

Ответы [ 5 ]

7 голосов
/ 31 марта 2009

Вот еще один способ написать это, который может решить проблемы с доступом к второй таблице больше, чем необходимо.

select col1,col2,
case when col3='E01089001' then 1 else 2 end,
case when col3='E01089001' then 3 else 4 end
end
from Table1, dual
where col1='A0529';

В вашем примере используется явно упрощенный подзапрос, поэтому эта версия выглядит глупо как есть; нет никаких причин присоединяться к DUAL вообще. Но в вашем реальном запросе вы, вероятно, имеете подзапрос, такой как SELECT a, b FROM otherTable WHERE someCondition. Таким образом, вы хотите использовать фактические имена столбцов вместо числовых литералов и фактическое имя таблицы вместо двойных, и переместить условия подзапроса в заключительное предложение WHERE.

2 голосов
/ 31 марта 2009

Быстрое и грязное решение.

select dummy,substr(c,1,instr(c,',')-1) c1,substr(c,instr(c,',')+1) c2
from (
select dummy,
case when dummy='X' then 
        (select 1||','||3 from dual)
end c
from (select * from dual)
)
1 голос
/ 31 марта 2009

Case поддерживает несколько столбцов в условной проверке

CASE WHEN A=X AND B=Y THEN ... END

В вашем примере вы пытаетесь вернуть таблицу (2 столбца) в набор результатов, который ожидает один столбец: col1, col2, (col3, col4).

Вам необходимо вернуть их отдельно: col1, col2, col3, col4

select
col1,
col2,
case when col3='E01089001' then (select 1 from dual) else (select 3 from dual) end,
case when col3='E01089001' then (select 2 from dual) else (select 4 from dual) end
from Table1 where col1='A0529';
1 голос
/ 31 марта 2009

Если в каждом случае допускается только один столбец, то вам, вероятно, понадобятся два случая:

select col1,col2,
case when col3='E01089001' then 
    (select 1 from dual)
else
    (select 2 from dual)
end,
case when col3='E01089001' then 
    (select 3 from dual)
else
    (select 4 from dual)
end
from Table1
where col1='A0529';

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

0 голосов
/ 17 июня 2011

Лучший подход для меня - использовать REGEXP_REPLACE. Получите единственную строку, возвращенную из оператора case, и во внешнем блоке запроса выберите команду разбить строку на разные поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...