PL / SQL ... если внутри выбора? - PullRequest
1 голос
/ 27 ноября 2009

Я довольно новичок, когда дело доходит до PL / SQL, и мне нужно изменить чужую хранимую процедуру.

Можно ли добавить оператор if в середине выбора? У меня есть процедура, чтобы попытаться открыть курсор и выбрать в нем кучу вещей из разных таблиц (не спрашивайте меня, почему они не использовали соединение) и вернуть курсор. Я пытаюсь создать две колонки с похожими данными, которые нельзя заполнить одновременно. Поэтому, если один равен нулю, другой должен иметь значение, а для курсора необходимо значение из того, что заполнено. Итак ... если оператор внутри выбора?

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

open rc for
select l.data1 as ld1, l.data2 as ld2, b.data1 as bd1, 
       b.data2 as bd2, c.data1 as as c_d1, c.data2 as cd2
from tablel l, tableb b, tablec c
where blahblahblah
and c.data1 = [b.data3 if b.data4 is null, else b.data4]?

Я не могу понять синтаксис, если это возможно.

Ответы [ 5 ]

8 голосов
/ 27 ноября 2009

Для этого вы можете использовать NVL или COALESCE:

open rc for
select l.data1 as ld1, l.data2 as ld2, b.data1 as bd1,
       b.data2 as bd2, c.data1 as as c_d1, c.data2 as cd2
from tablel l, tableb b, tablec c
where blahblahblah
and c.data1 = coalesce(b.data4,b.data3)
5 голосов
/ 27 ноября 2009

Использовать вместо этого регистр?

and c.data1 = CASE WHEN b.data3 IS NOT NULL THEN b.data3 ELSE b.data4 END
3 голосов
/ 27 ноября 2009

Используйте decode или case, в зависимости от вашей версии Oracle.

Например:

and c.data1 = case bdata4 when null then bdata3 else bdata4 end

Decode аналогичен, но используйте вариант, если только вы не вынуждены использовать decode, так как его легче читать.

Примеры

1 голос
/ 27 ноября 2009

Вам не нужно IF, вы можете сделать это с OR.

SELECT
    l.data1 AS ld1, 
    l.data2 AS ld2, 
    b.data1 AS bd1, 
    b.data2 AS bd2, 
    c.data1 AS c_d1, 
    c.data2 AS cd2
FROM
    tablel l, 
    tableb b,
    tablec c
WHERE
    ... blahblahblah ...
AND (
      ( b.data4 IS NULL AND c.data1 = b.data3 ) OR ( c.data1 = b.data4 )
    )
0 голосов
/ 27 ноября 2009

Похоже, вам нужен оператор case в секции select?

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