2014-01-15 123 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

相关问题