2017-03-28 1 views
0

Oracle 12 (및 APEX)에서 WHERE 절의 CASE 문에 문제가 있습니다. 시나리오는 마스터 테이블, ORDER 및 PRODUCTS_BOUGHT 테이블이므로 일대 다 관계입니다. PRODUCTS_BOUGHT에 대한 필터가있는 보고서가 있습니다. 필터는 P36_PRODUCT_LISTING이라는 바인드 변수/APEX 페이지 항목을 채 웁니다. 사용자가 특정 제품을 선택하면 해당 제품이 포함 된 주문 만 보고서에 표시됩니다. 필터에는 'All'이라는 단어가 포함되어 있습니다.이 단어는 필터링을하지 않아야하며, 각 제품에도 적용됩니다.Oracle : where 절에서 case 문 사용

내 SQL 문은 내가 문을 실행할 때, 내가 오류가 키워드가 없습니다

Select distinct 
    :P36_PRODUCT_LISTING,  
    LISTAGG(product_name, ', ') WITHIN GROUP (ORDER BY product_name) OVER (PARTITION BY B.SALES_ORDER_NUMBER) AS products, 
    ... 
from ORDER A, PRODUCTS_BOUGHT B 
where 
A.SALES_ORDER_NUMBER = B.SALES_ORDER_NUMBER 
and 
case when 
:P36_PRODUCT_LISTING = 'All' then 1 = 1 
else a.SALES_ORDER_NUMBER IN (SELECT SALES_ORDER_NUMBER from PRODUCTS_BOUGHT where PRODUCT_NAME = :P36_PRODUCT_LISTING) end 

입니다. 내가 뭘 잘못하고 있니?

+0

사용 AND/OR 대신에 케이스입니다! – jarlh

답변

1

case을 사용하지 마십시오.

where (:P36_PRODUCT_LISTING = 'All' or 
     a.SALES_ORDER_NUMBER IN (SELECT SALES_ORDER_NUMBER 
           from PRODUCTS_BOUGHT 
           where PRODUCT_NAME = :P36_PRODUCT_LISTING 
           ) 
    ) 

(당신이 그것을 쓴대로) case의 문제는 오라클이 유효한 값으로 논리식에서 값을 취급하지 않는다는 것입니다 : 그냥 부울 논리를 사용합니다. 일부 데이터베이스는 있지만 오라클은 수행하지 않습니다. 또한

:

  • from 절에 쉼표를 사용하지 마십시오. 항상 적절하고 명시적인 join 구문을 사용하십시오.
  • 테이블 이름의 약어 인 테이블 별명을 사용하십시오. 쿼리를 읽고 버그를 수정하는 것이 훨씬 쉽습니다.
  • select distinct이 여기에 필요하지 않아야합니다. 어쨌든 group by없이 집계를 수행하므로 행이 하나뿐입니다.

그래서 :

Select :P36_PRODUCT_LISTING,  
     LISTAGG(b.product_name, ', ') WITHIN GROUP (ORDER BY b.product_name) OVER (PARTITION BY B.SALES_ORDER_NUMBER) AS products, 
    ... 
from ORDER o join 
    PRODUCTS_BOUGHT B 
    on p.SALES_ORDER_NUMBER = B.SALES_ORDER_NUMBER 
    where (:P36_PRODUCT_LISTING = 'All' or 
      o.SALES_ORDER_NUMBER IN (SELECT SALES_ORDER_NUMBER 
            from PRODUCTS_BOUGHT 
            where PRODUCT_NAME = :P36_PRODUCT_LISTING 
            ) 
     ); 
+0

나는 정말로 낡은 구문을 가르치고있는 사람이 누구인지 궁금해지기 시작했다. 거의 10 년 오래된 것입니다 – JohnHC

+0

누가 옛 구문을 가르치는 지에 관한 문제가 아닙니다. 20 년 전에이 구문을 배웠던 것은 문제입니다 ...;) – user1009073

0

케이스는 ..하지 성명, 값을 반환하는

시도를 설계 또는 대신

where :P36_PRODUCT_LISTING = 'All' 
or (:P36_PRODUCT_LISTING <> 'All' 
    and a.SALES_ORDER_NUMBER IN (SELECT SALES_ORDER_NUMBER from PRODUCTS_BOUGHT where PRODUCT_NAME = :P36_PRODUCT_LISTING))