2015-09-04 15 views
0

我們如何使用變量作爲列名?如何使用變量來選擇哪一列?

在我的表中天(星期一,星期二..)是列名。

我想動態地獲取DAY並在我的查詢中使用AS COLUMN NAME。

我的查詢:

SELECT EMP FROM SCHEDULE WHERE "DAY"(Dynamically I want) =1; 

回答

1

你根本不能使用變量來更改查詢的實際文本。變量可以用來代替字面值(日期,字符串,時間,數字),但它們不能改變實際命令的文本。

技術上的原因是(過於簡單的事情)oracle FIRST解析文本,建立一個執行計劃,並且只有在這之後才考慮變量的值。或多或少,你可以認爲(這只是一個比喻,當然,它不是真的一樣的東西!)oracle「編譯」查詢就像C++編譯器編譯函數的源代碼:這是不可能的將C++過程傳遞給修改過程本身文本的變量。

你必須做的是重新考慮你的方法採取在考慮什麼,我只是說:

 SELECT EMP FROM SCHEDULE 
     WHERE 
      (case :DAY_I_WANT 
       WHEN 'MONDAY' then -- 'MONDAY' is the string value of the variable :DAY_I_WANT 
        monday -- monday, here is the column whose value I want CASE to return 
       WHEN 'TUESDAY' then tuesday 
       ... 
       ... 
       WHEN 'SUNDAY' then sunday 
      end) = 1 

記住,這個解決方案將不採取上的MONDAY..SUNDAY列任何指數的優勢。最好的辦法是創建一個不同的數據結構,每天有一個單獨的行,並有適當的dayofweek列。如果你這樣做,你就可以能寫:

select EMP from schedule 
    where schedule.DAY = :DAY_I_WANT 

,它可以讓你在天列創建索引,加快搜索。

每天有一個單獨的列等於尋找麻煩。

+1

假設這實際上是在PL/SQL過程中,您可以*使用動態SQL來更改查詢的實際文本;但是使用案例當然更好。 –

+0

實際上,pl/sql中最好的方法是編寫一個函數,根據dayofwe的值打開並返回一個不同的遊標。這將利用索引,並避免動態sql(這是容易hyde語法錯誤,直到運行時)...但我不知道他是否正在談論一個查詢,將在一個plsql過程中執行... –