2014-08-28 3 views
0

Как добавить сравнить отборное заявление в if() состоянии в Oracle PL-SQLКак добавить сравнить отборное заявление, если() условие оракул пл-SQL

IF((v_c1.int_rate = '0') 
    AND (local_type_advances in (SELECT DISTINCT(REF_CODE) 
           FROM XYZ 
           WHERE REF_REC_TYPE = '39' AND DEL_FLG = 'N'   
            AND REF_CODE BETWEEN '1' AND '50'))) 

где выберите запрос сгенерировать следующий вывод

'31','32','33' 

Теперь, как показано ниже, если я жёстко его, то он работает нормально, но в запросе не работает

IF((v_c1.int_rate='0') AND (local_type_advances in ('31','32','33'))) 
+0

Возможно, в коде есть другие символы, которые вы не видите - например, ведущие пробелы. –

ответ

1

То, что я сделал это, я храним результат этого выбора даного в localvariable в varchar2. И добавил этот местный VARCHAR в том, что если условие это находится в пункте как результат, вместо этого выберите даного

select '''' || listagg(REF_CODE, ''',''') within group (order by REF_CODE) || '''' as type_advances into local_type_advances_list from [email protected] where REF_REC_TYPE = '39' AND DEL_FLG = 'N' AND REF_CODE BETWEEN '1' AND '50'; 


IF((v_c1.int_rate='0') AND (local_type_advances in (local_type_advances_list))) 
0

Поскольку вы не можете иметь оператор select в предложении IN, разделите его на две части. Выберите диапазон, необходимый для поиска в переменной, затем найдите эту переменную, чтобы увидеть, есть ли там значение. Вот рабочий пример с использованием LISTAGG(), чтобы вернуть список, разделенный запятыми, в переменную и REGEXP_LIKE, чтобы проверить список в переменной, чтобы увидеть, находится ли значение в списке. X_TBL имеет один столбец, X_COL, который содержит три строки: «31», «32» и «33» соответственно.

declare 
    local_type_advance_string varchar2(50);  -- Holds the list returned from 
               -- the query. 
    local_type_advance_nbr varchar2(2) := '32'; -- Value to test the list for. 
begin 

    -- Use listagg() to select a comma-separated list into a string variable. 
    -- X_TBL is the table, X_COL is the column. 
    SELECT LISTAGG(X_COL, ',') WITHIN GROUP(ORDER BY X_COL) 
    into local_type_advance_string 
    FROM X_TBL; 

    --dbms_output.put_line(local_type_advance_string); 

    IF regexp_like(local_type_advance_string, '(^|\W)'|| 
       local_type_advance_nbr || '(\W|$)') then 
    dbms_output.put_line(local_type_advance_nbr || ' Is in there!'); 
    else 
    dbms_output.put_line(local_type_advance_nbr || ' Is not found'); 
    end if; 

end; 

Регулярное выражение позволяет позиции поиска числа не имеет значения, если это в начале, середине или в конце списка.

Run с помощью жабы:

32 Is in there! 
0

Даже если вы могли бы положить, что большой, Honkin' select в там, я бы рекомендовал держать в if заявление просто для ремонтопригодности. Это работает и намного яснее, особенно если добавить осмысленные комментарии:

create table XYZ(
    REF_REC_TYPE int, 
    DEL_FLG  char(1), 
    REF_CODE  int 
); 

insert into XYZ 
select 39, 'Y', 28 from dual union all 
select 39, 'Y', 29 from dual union all 
select 39, 'Y', 30 from dual union all 
select 39, 'N', 31 from dual union all 
select 39, 'N', 32 from dual union all 
select 39, 'N', 33 from dual union all 
select 39, 'Y', 34 from dual union all 
select 39, 'Y', 35 from dual union all 
select 39, 'Y', 36 from dual; 

DECLARE 
    int_rate   INT := 0; 
    local_type_advances INT := 32; 
    found    INT; 
BEGIN 
    -- See if we have any whatever 
    SELECT count(*) 
    INTO found 
    FROM XYZ 
    WHERE REF_REC_TYPE = 39 
    AND DEL_FLG = 'N'   
    AND REF_CODE = local_type_advances; 

    IF int_rate = 0 
    AND found > 0 THEN 
     dbms_output.put_line('True: ' || found); 
    ELSE 
     dbms_output.put_line('False: ' || found); 
    END IF; 
END; 

Btw, это не выполняющее в SqlFiddle по какой-то причине. Как это бывает, я нашел совершенно хороший Oracle DB, сидящий в ящике под некоторыми старыми салфетками. Поэтому я могу проверить, что это хороший код.

Смежные вопросы