2009-11-26 4 views
1

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

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

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

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]? 

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

ответ

1

Вам не нужен 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) 
    ) 
5

Использовать деловую форму вместо этого?

and c.data1 = CASE WHEN b.data3 IS NOT NULL THEN b.data3 ELSE b.data4 END 
8

Вы можете использовать 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) 
+3

COALESCE предпочтительнее, потому что это ANSI - он будет работать на Oracle, SQL Server, MySQL ... –

+1

Также NVL2 также является опцией: http://techonthenet.com/oracle/functions/nvl2.php –

+0

, что soudns awesome ... за исключением случаев, когда я пытаюсь использовать coalesce или NVL с одним из значений внутри, являющимся выбором из другой таблицы, я получаю «столбец не может быть внешним соединен с подзапросом» это возможно? coalesce (b.data4, (выберите d.data4 из dabled d, где d.data3 = b.data3))? – 2009-11-27 15:26:17

3

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

Например:

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

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

Examples

+0

И поскольку 'CASE' является ANSI - он будет работать на SQL Server или MySQL –

0

Похоже, вам нужен случай заявление в разделе выбора?