2014-08-28 54 views
0

如何加入甲骨文的PL-SQL中if()條件比較select語句如何添加在比較選擇語句,如果()條件的Oracle PL-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

也許在代碼中還有其他字符,例如,您沒有看到 - 前導空格。 – 2014-08-28 12:08:00

回答

1

我所做的是,我已經存儲的選擇statment的結果所以LocalVariable爲VARCHAR2。而在添加了這個地方VARCHAR如果條件的條款作爲結果,而不是該選擇statment

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

由於在IN子句中不能有select語句,因此將其分爲兩部分。選擇需要搜索變量的範圍,然後搜索該變量以查看該值是否存在。這是一個使用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; 

正則表達式允許搜索號的位置,而不管它是在列表的開始,中間還是結尾。通過蟾蜍

運行:

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; 

順便說一句,這並不在SqlFiddle出於某種原因執行。碰巧,我發現一個完美的Oracle DB在一些舊餐巾紙下放在抽屜裏。所以我可以驗證這是很好的代碼。