2015-11-24 119 views
0

我想知道是否有一種方法來顯示查詢字段不存在的select語句的某些默認值。SQL Select語句 - 字段不存在時的默認字段值

例如,

SELECT t.name, t.type, t.price, t.brand FROM some_table t; 

如果「品牌」字段中不存在some_table我想這個說法,顯示「品牌」爲「不可用」。

最終我想從該select語句創建一個視圖。 我只是好奇,是否有辦法在PL/SQL中做到這一點。

編輯: 爲避免混淆,我希望當表中'品牌'列不存在時,語句才能編譯和工作。

+5

列名必須在編譯時已知。一種解決方法是使用dynamic-sql – lad2025

+0

好的,謝謝。我會看看動態sql – Grentley

+1

只是爲了確保您正確理解@ lad2025的註釋,當值爲* null *時是否需要默認值,或者您想要查詢字段'name','type' ,'價格','品牌'從表中不能在運行時確定? –

回答

1

我剛纔看到上面的問題。這似乎很奇怪的設計或要求。我發佈的代碼片段可能足以解決您的問題,但理想情況下,這不應該是這樣的。

--So i get chance to look into the question asked simple way to get a workaround for your problem is to fetch out the columns list from table 
var p_lst refcursor; 
SET serveroutput ON; 
DECLARE 
    lv_sql LONG; 
    lv_tab_name VARCHAR2(100); 
    lv_col_chk VARCHAR2(1000 CHAR); 
BEGIN 
    FOR I IN 
    (SELECT * FROM ALL_TAB_COLUMNS WHERE OWNER = 'AVROY' AND TABLE_NAME = 'EMP' 
) 
    LOOP 
    lv_tab_name:=I.TABLE_NAME; 
    lv_sql  :=lv_sql||','||i.column_name; 
    END LOOP; 
    lv_sql:='SELECT '||SUBSTR(lv_sql,2,LENGTH(lv_sql)); 
    dbms_output.put_line(lv_sql); 
    lv_col_chk:=INSTR(UPPER(lv_sql),'BRAND',1); 
    dbms_output.put_line(lv_col_chk); 
    IF lv_col_chk = 0 THEN 
    lv_sql  :=SUBSTR(lv_sql,1,LENGTH(lv_sql))||', ''Not_available'' as Brand_col FROM '||lv_tab_name; 
    dbms_output.put_line(LV_SQL); 
    ELSE 
    lv_sql:=SUBSTR(lv_sql,1,LENGTH(lv_sql))||' FROM '||lv_tab_name; 
    dbms_output.put_line(LV_SQL); 
    END IF; 
    OPEN :p_lst FOR lv_sql; 
END; 
PRINT p_lst; 
1

您可以使用COALESCE,通過not available

SELECT t.name, t.type, t.price, COALESCE(t.brand,'not available') AS brand FROM some_table t; 

COALESCE是SQL標準改變null,但我不知道如果甲骨文擁有它。

編輯:

我認爲你必須檢查現場存在於表第一,成才,如:

Select count(*) into v_column_exists 
from user_tab_cols 
where column_name = 'ADD_TMS' 
    and table_name = 'EMP'; 

如果1存在,那麼別的不存在的,之後創建一個基於結果的看法。

1:

SELECT t.name, t.type, t.price, t.brand FROM some_table t; 

2:

SELECT t.name, t.type, t.price, 'not available' AS brand FROM some_table t; 

,但我不能看到在視圖中使用的正確方法。

+1

當表沒有列'品牌'時,你會得到什麼? Oracle有'NVL'的方式 – lad2025

+2

編譯錯誤。 – Amasa

+1

@ lad2025對不起,現在我明白了這個問題,刪除了答案? –

1
SELECT t.name, t.type, t.price, NVL(t.brand,"Not available") FROM some_table t; 
2

除非你有一些很沉重,笨拙的元數據收集去你只需要查詢主表來獲取數據,然後逆轉置這一切成行,您無法查詢,不因存在的列編譯器會開始連接他的東西,並不會找到列。

您可以通過使用動態sql來繞過該錯誤,但是由於您仍然在查詢不存在的列,因此只會產生運行時錯誤。

這意味着如果您的動態SQL不在該表中,那麼您的動態SQL將不得不排除列,在這一點上,您最好簡單地從靜態SQL中刪除該列。動態SQL真的會更好的唯一的一點是,如果你必須查詢30+表,並且你知道你在做什麼

所以基本上,爲什麼你需要查詢不存在的列?在你的情況下,如果只能保留一個過時的視圖,你最好在需要更新時維護你的視圖。

+2

我認爲這個想法應該是,作爲動態sql的一部分,您需要檢查列的存在,然後將其添加到選擇列表中,或者在其位置使用「Not available」字面值,並使用合適的別名。 – Boneist

+0

是的,我的回答是誤導性的,我重新說明了它應該會更好。 –