2014-01-15 4 views
1

나는 여러 번 사용해야하는 조항이 하나 있습니다. Oracle SQL에 익숙하지 않으므로 newbe 실수를 저에게 용서해 주시기 바랍니다 :). . 나는이 웹 사이트를 읽고,하지만 답을 :(찾을 수 없습니다 여기에 SQL 문의 :.변수를 사용하는 방법 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 문을 사용하지는 않았지만 확실히 테스트해볼 것입니다. 쿼리를 실행하는 응용 프로그램이 from 및 where 절을 보내고 중복을 작성하기 때문에 그룹을 사용해야합니다. 이 절은 최종 사용자가 제공합니다. – user3198582