2013-05-12 2 views
0

나는 다음과 같은 sql 질문을 가지고있어서 저에게 효과적이지 않습니다. 마지막 CASE 행이 잘못되었음을 알고 있지만 내 where 절에서 CASE 문을 사용하고 싶습니다.SQL - where 절의 사례

내 상황에 대한 간단한 설명 : "회사 ID"와 연결된 자료가있는 회사가 여러 곳 있습니다. 각 자료는 pricelist_entries의 행에 링크 될 수 있습니다. 여러 물질 행에 연결된 pricelist_entries 테이블에서 한 행을 검색하면 모든 행이 반환되지만 현재 회사 (검색을 수행하는 회사)에 속한 행만 반환하려고합니다. 결론 : materialID가 NULL이 아닌 경우 materials.company = "current.companyID".

SELECT peID, peName, materialID 
FROM pricelist_entries 
INNER JOIN pricelist ON pricelist_entries.peParentID=pricelist.pID 
LEFT JOIN materials ON pricelist_entries.peID=materials.pricelist_entries_id 
WHERE peBrand = 'Kama' AND pricelist.pCurrent = 1 
    AND (peName LIKE '%gocamp de%' OR peArtnr LIKE '%gocamp de%') 
    AND pricelist.country=0 AND pricelist_entries.peDeleted=0 
CASE materialID WHEN IS NOT NULL THEN materials.companyID=10 END 

더 나은 방법으로 내 문제를 설명해야하는지 알려주세요. 미리 감사드립니다.

답변

2

조건을 조인으로 옮기는 것만 큼 간단 할 수 있습니다.

SELECT peID, peName, materialID 
FROM pricelist_entries 
INNER JOIN pricelist 
    ON pricelist_entries.peParentID=pricelist.pID 
LEFT JOIN materials 
    ON pricelist_entries.peID=materials.pricelist_entries_id 
AND materials.companyID=10         -- << condition 
WHERE peBrand = 'Kama' AND pricelist.pCurrent = 1 
    AND (peName LIKE '%gocamp de%' OR peArtnr LIKE '%gocamp de%') 
    AND pricelist.country=0 AND pricelist_entries.peDeleted=0 

올바른 회사에 링크 된 재료 행에만 남습니다.

+1

정확히 내가 찾고있는 것이 었습니다. 감사! :) – hgerdin

0

내가 아는 where 절에서 CASE를 사용할 수 없으므로 SELECT 부분에서 사용해야하지만 동일한 효과가 있습니다. 이런 식으로 뭔가 작업을해야합니다 :

SELECT CASE materialid WHEN IS NOT NULL THEN companyid END as thiscompanyid 

이 당신에게 새 열 이름 thiscompanyid을 줄 것이다 당신은 당신이 필요로하는 것을 얻기 위해 그 오프 쿼리 할 수 ​​있습니다.