2014-01-15 101 views
1

我有一個where子句,我必須使用多次。我對Oracle SQL很陌生,所以請原諒我的錯誤:)。我看過這個網站,但無法找到答案:(這裏的SQL語句:如何使用變量AS where子句?

var condition varchar2(100) 
    exec :condition := 'column 1 = 1 AND column2 = 2, etc.' 

    Select a.content, b.content 
    from 
    (Select (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,3)) as content 
    from table_name 
    where category = X AND :condition 
    group by (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,3)) 
    ) A 
    , 
    (Select (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,100)) as content 
    from table_name 
    where category = Y AND :condition 
    group by (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,100))) B 
    GROUP BY 
    a.content, b.content 

內容字段是一個CLOB場,不幸的是需要所有值都在同一列我的查詢不起作用

回答

1

你不能在一個where子句中使用綁定變量,只能用於特定的值。如果你正在SQL * Plus或SQL Developer中運行這個替換變量,其他客戶):

define condition = 'column 1 = 1 AND column2 = 2, etc.' 

Select a.content, b.content 
from 
(Select (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,3)) as content 
from table_name 
where category = X AND &condition 
... 

Fro在其他地方,包括JDBC和OCI,您需要將條件作爲變量並使用它構建查詢字符串,因此它在解析器看到的代碼中重複。從PL/SQL你可以使用動態SQL來實現同樣的事情。我不確定爲什麼只是重複條件是一個問題,但如果價值觀發生變化,就會引起爭議。當然有兩個這樣的子句似乎有點無意義。

但也許你可以從不同的角度來解決這個問題,並且不需要重複where條款。無論如何,查詢表格兩次可能效率不高。你可以一次套用條件的子查詢,但不知道你的索引或條件的選擇性,這可能會更糟:

with sub_table as (
    select category, content 
    from my_table 
    where category in (X, Y) 
    and column 1 = 1 AND column2 = 2, etc. 
) 
Select a.content, b.content 
from 
(Select (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,3)) as content 
from sub_table 
where category = X 
group by (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,3)) 
) A 
, 
(Select (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,100)) as content 
from sub_table 
where category = Y 
group by (DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,100))) B 
GROUP BY 
a.content, b.content 

我不知道分組是什麼 - 消除重複?如果你有一個匹配其他條件的單個X和Y記錄,這真的很有意義,不是嗎?也許我沒有正確遵守。

你也可以使用一個case聲明:

select max(content_x), max(content_y) 
from (
    select 
    case when category = X 
     then DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,3) end as content_x, 
    case when category = Y 
     then DBMS_LOB.SUBSTR(ost_bama_vrij_veld.inhoud,100) end as content_y, 
    from my_table 
    where category in (X, Y) 
    and column 1 = 1 AND column2 = 2, etc. 
) 
+0

謝謝你的回答,第一個查詢完全在SQL開發人員。我必須檢查它是否也適用於BI發佈者:)。 第二個查詢是個好主意。我之前沒有使用with語句,但是我一定會嘗試一下(看哪一個表現更好)。 由於需要group by,因此運行查詢的應用程序還會發送from和where子句,從而創建重複項。這些條款由最終用戶提供。 – user3198582

相關問題