oracle - 如何将变量用作where子句?

  显示原文与译文双语对照的内容

我有一个where子句,我必须多次使用它。 我对 Oracle SQL非常陌生,所以请原谅我的newbe错误:) 。 我已经阅读这里网站,但无法找到答案:( 。 下面是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 

内容字段是一个CLOB字段,不幸的是,所需的所有值都在同一列中。 我的查询无法正常工作。

时间: 作者:

不能对 where 子句使用绑定变量,只对特定值使用绑定变量。 如果在SQL*Plus或者SQL开发人员( 也许还有其他客户) 中运行这里变量,则可以使用替换变量:


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和 tmodel,你需要使用这个条件,并使用该条件构建查询字符串。 在 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.
)

作者:
...