2015-12-03 74 views
1

中選擇語句我想知道是否有可能編寫一個sql查詢返回一組基於條件的列。如果否則在Oracle sql developer

例如像:

If (id=='A') 
{ 
    Select id,name 
    From Table A 
} 
Else If(Condition=B) 
{ 
    Select Column1, Column3 
    From Table A 
} 

如果是,請幫我寫它

+0

沒有這不可能在SQL中,您需要使用PL/SQL(可能還有動態SQL)。你比較的'id'的值是從哪裏來的? –

回答

0

您可以在普通SQL中使用CASE表達式做類似switch的語句。請參閱以下example

SELECT some_other_field, 
      id, 
      CASE ID 
      WHEN A THEN columnA 
      WHEN B THEN columnB 
      ELSE 'Unknown' 
      END genericvalue 
FROM  customers; 

當然也有一定的侷限性。例如,THEN子句中返回值的類型需要匹配,因此您可能需要將所有轉換爲char或int等。

1

SQL本身並不完整,它不會完成沒有循環和條件的語法:無論它有多複雜,您都可以使用它執行查詢,但無法根據條件決定執行哪個查詢或執行多次查詢,這就是你正試圖在這裏做。

爲了提供這樣的功能,每個數據庫開發人員通常會提供一個額外的語言,包括變量聲明,循環,條件等等。對於Oracle,這種語言是PL/SQL。

你需要在SQL Developer中如何解決您的問題,看看PL/SQL是如何工作的是創建一個空的腳本,然後寫是這樣的:

--Enabling output to the console 
SET SERVEROUTPUT ON; 
DECLARE 
--Variable declaration block; can initialize variables here too 
    test_var varchar2(10); 
    test_result varchar2(10); 
BEGIN 
--Initializing variables, the first one we will check in the IF statement, the second one is just for transparency 
    test_var := 'test'; 
    test_result := ''; 

--IF block: check some condition, perform a select based on the value, save result into a variable 
    IF test_var = 'test' THEN 
     SELECT '1' INTO test_result FROM dual; 
    ELSE 
     SELECT '2' INTO test_result FROM dual; 
    END IF; 

--Output the result to console 
    DBMS_OUTPUT.PUT_LINE(test_result); 

END; 

然後用「運行腳本」運行/ F5。你會得到'1'作爲你所期望的輸出。將test_var更改爲其他內容並再次運行,您將得到'2'。

如果您有這類問題,請閱讀有關SQL和PL/SQL的具體內容。 PL/SQL非常高效且通用,可用於從自動SQL腳本到實現複雜優化算法的任何事情。

當然,PL/SQL具有用於類似的結構和while循環,例檢查等

0

我想這是你在找什麼。

即使使用CASE和DECODE,也無法在SQL中做這樣的選擇。

但是我們可以做的最好的是我們可以創建一個函數,它返回一個ref_cursor並在SQL實例中使用函數來滿足您的需求。

下面是一個例子吧:

CREATE OR REPLACE 
    FUNCTION test1(
     id1 VARCHAR) 
    RETURN sys_refcursor 
    AS 
    v_ref sys_refcursor; 
    BEGIN 
    IF(id1='A') THEN 
     OPEN v_ref FOR SELECT id,name FROM TABLE A; 
    ElsIf(id1='B') THEN 
     OPEN v_ref FOR SELECT Column1, Column3 FROM TABLE A; 
    END IF; 
    RETURN v_ref; 
    END; 

select test1(A) from dual; 

上面會顯示僅列編號和名稱。

相關問題