0
我們如何使用變量作爲列名?如何使用變量來選擇哪一列?
在我的表中天(星期一,星期二..)是列名。
我想動態地獲取DAY並在我的查詢中使用AS COLUMN NAME。
我的查詢:
SELECT EMP FROM SCHEDULE WHERE "DAY"(Dynamically I want) =1;
我們如何使用變量作爲列名?如何使用變量來選擇哪一列?
在我的表中天(星期一,星期二..)是列名。
我想動態地獲取DAY並在我的查詢中使用AS COLUMN NAME。
我的查詢:
SELECT EMP FROM SCHEDULE WHERE "DAY"(Dynamically I want) =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
,它可以讓你在天列創建索引,加快搜索。
每天有一個單獨的列等於尋找麻煩。
假設這實際上是在PL/SQL過程中,您可以*使用動態SQL來更改查詢的實際文本;但是使用案例當然更好。 –
實際上,pl/sql中最好的方法是編寫一個函數,根據dayofwe的值打開並返回一個不同的遊標。這將利用索引,並避免動態sql(這是容易hyde語法錯誤,直到運行時)...但我不知道他是否正在談論一個查詢,將在一個plsql過程中執行... –