2014-11-24 21 views
0

我遇到了一塊T-SQL,我試圖轉換成Oracle。它看起來像這樣:Oracle的情況下,當存在使用相同的變量插入到

SET @local variable= 
    CASE 
     when exists (select field from table where value=0) then 0 
     when exists (select same field from same table where value=1) then 1 
     when exists (select same fieldfrom same table where value=2) then 1 
     else @local variable 
    END 

@local變量在過程的前面查詢的結果中設置。現在

,我想這在下面的方式轉換到Oracle:

BEGIN 
    SELECT CASE 
     WHEN EXISTS (
      SELECT field 
      FROM table 
      WHERE value = 0 
     ) 
     THEN 0 
     WHEN EXISTS (
      SELECT same field 
      FROM same table 
      WHERE value = 1 
     ) 
     THEN 1 
     WHEN EXISTS (
      SELECT same field 
      FROM same table 
      WHERE value = 2 
     ) 
     THEN 1 
     ELSE localvariable 
    END 
    INTO localvariable 
    FROM DUAL; 
END; 

然而,PL/SQL似乎沒有使用@localvariable在else語句喜歡我進入聲明。我知道這可能不是一個寫得很好的查詢,但是這裏的解決方案是什麼?我如何在合法的PL/SQL中編寫這個代碼?

回答

1

CASEEXISTS不能按您期望的方式使用

你可以做這樣的事情。

DECLARE 
    localvariable1 NUMBER; 
    localvariable2 NUMBER; 
    localvariable3 NUMBER; 
    localvariable NUMBER; 
BEGIN 

    SELECT COUNT(DECODE(value,'0',field)) as v1, 
      COUNT(DECODE(value,'1',field)) as v2, 
      COUNT(DECODE(value,'2',field)) as v3 
    INTO 
      localvariable1, 
      localvariable2, 
      localvariable3 
    FROM table; 

    IF(localvariable1 > 0) 
    THEN 
     localvariable := 0; 
    ELSIF(localvariable2 > 0 OR localvariable3 > 0) 
    THEN 
     localvariable := 1; 
    END; 
END; 
+0

我喜歡這個。謝謝 – 2014-11-25 11:16:51

+0

雖然對錶格進行了全面掃描。 – 2015-04-10 15:36:37

1

我不能假設只有一個表中或該where子句包含其它濾波縮小結果設置爲一個記錄的記錄。以下建議重複瞭如果有多行並且每個行的值字段可能不同,則結果將基於找到的最低值。

declare LocalVar number; 
... 
select case Min(Value) 
     when 0 then 0 
     when 1 then 1 
     when 2 then 1 
     else LocalVar end 
into LocalVar 
from SomeTable 
where Value between 0 and 2 
    and possible_other_criteria; 

事實上,T-SQL查詢寫得非常糟糕。爲什麼在同一個表中只有一個查詢可以達到相同的結果時,最多可以對三個查詢進行查詢。它可以更改爲與PL/SQL幾乎相同的查詢。事實上,它看起來像語法是一樣的。

0

正確的方法是使用臨時變量分配給(在Oracle11.2克測試):

 
    DECLARE 
    tmp pls_integer; 
    BEGIN 
     SELECT CASE 
      WHEN EXISTS (
       SELECT 1 
       FROM any_table1 
       WHERE value = 0 
      ) 
      THEN 0 
      WHEN EXISTS (
       SELECT 1 
       FROM any_table2 
       WHERE value = 1 
      ) 
      THEN 1 
      WHEN EXISTS (
       SELECT 1 
       FROM any_table3 
       WHERE value = 2 
      ) 
      THEN 1 
      ELSE :localvariable 
     END 
     INTO tmp 
     FROM DUAL; 
    :localvariable := tmp; 
    END; 
    /

相關問題