簡體   English   中英

如何在AS子句中使用變量AS?

[英]How to use a variable AS a where clause?

我有一個where子句,必須多次使用。 我對Oracle SQL還是很陌生,所以請原諒我的新手錯誤:)。 我已經閱讀了該網站,但找不到答案:(.。這是SQL語句:

    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  

content字段是CLOB字段,不幸的是,所有需要的值都在同一列中。 我的查詢當然行不通。

您不能對這么多的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
...

在其他地方,包括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.
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM