2011-09-22 5 views
1

WHERE 절의 한 부분을 변수에 값이있는 조건에서 수행하고 싶습니다. 나는 여러 가지 방법으로이 글을 쓰려고 노력했지만 항상 실수를 범하고 누군가가 도울 수 있는지 궁금해하고 있었다.SQL : var = ''WHERE 절에 조건을 추가하지 않습니다.

아래 코드는 작동하는 현재 SQL 문이지만 @itemId가 비어 있으면 아무 것도 반환하지 않습니다. @itemId를 값으로 사용하는 경우에만 결과를 줄이고 싶습니다.

DECLARE @itemId nvarchar(max) 
SET @itemId = 'someId' 

SELECT 
SalesOrdersItems.Id, 
CASE 
    WHEN SalesOrderItems.ItemType = 'P' THEN Products.ProductId 
    WHEN SalesOrderItems.ItemType = 'S' THEN Sundries.SundryId 
    WHEN SalesOrderItems.ItemType = 'F' THEN FreightMethods.FreightMethodId 
    ELSE SalesOrderItems.FreeTextItem 
END AS ItemId 
FROM SalesOrderItems 
    LEFT OUTER JOIN Products ON SalesOrderItems.Product = Products.Product 
    LEFT OUTER JOIN Sundries ON SalesOrderItems.Sundry = Sundries.Sundry 
    LEFT OUTER JOIN FreightMethods ON SalesOrderItems.FreightMethod = FreightMethods.FreightMethod 
WHERE 
SalesOrdersItems.area LIKE 'SE%' 
AND (Products.ProductId = @itemId OR Sundries.SundryId = @itemId OR FreightMethods.FreightMethodId = @itemId OR SalesOrderItems.FreeTextItem = @itemId) 

나는 마지막 줄을 다음과 같이 작성하려고했지만 (아래 코드 참조) 작동하지 않습니다.

AND CASE 
     WHEN @itemId = '' THEN 1 
     ELSE (Products.ProductId = @itemId OR Sundries.SundryId = @itemId OR FreightMethods.FreightMethodId = @itemId OR SalesOrderItems.FreeTextItem = @itemId) 
    END 

내가 잘못 생각하는 사람이 있습니까?

+0

또는 귀하의 요구에 부합하지 않는 이유가 있습니까? AND (@itemID = ''OR (...)) – billinkc

+0

문제를 해결할 수는 없지만 테이블에 별칭 이름을 사용하면 혼란을 줄일 수 있습니다. – Beef

답변

2

내가 오해하고 있다면 알려 주시기 바랍니다. 빈 @itemID가 있으면 모든 결과를 원한다고 가정합니다. 그렇지 않으면 결과가 제한됩니다.

WHERE SalesOrdersItems.area LIKE 'SE%' 
AND ((@itemId != '' 
    AND (Products.ProductId = @itemId 
     OR Sundries.SundryId = @itemId 
     OR FreightMethods.FreightMethodId = @itemId 
     OR SalesOrderItems.FreeTextItem = @itemId)) 
    OR @itemId = '') 

나는 괄호가 정확하다고 생각하지만, 고르지 않을 수 있습니다. 바라건대 내 의도를 이해할만큼 명확하다.

+0

+1 처음에 기대했던 방식입니다. 일부 옵티 마이저는 심지어 제외 된 조건을 최적화 할 수있을 정도로 똑똑합니다. –

+0

+1 사악한 일이 많이 감사드립니다. –

1
... 
WHERE 
1 = CASE WHEN ... THEN 1 ELSE 0 END 
... 
0

당신은 아마 NULLIF()

AND CASE 
     WHEN NULLIF(@itemId, '') IS NULL THEN 1 
     ELSE (Products.ProductId = @itemId OR Sundries.SundryId = @itemId OR FreightMethods.FreightMethodId = @itemId OR SalesOrderItems.FreeTextItem = @itemId) 
    END 
0

내 이해 당으로, 아래처럼 뭔가해야 사용할 수 있습니다.

 (Products.ProductId = @itemId OR ISNULL(@itemId, '') = '') OR 
    (Sundries.SundryId = @itemId OR ISNULL(@itemId, '') = '') OR 
    (FreightMethods.FreightMethodId = @itemId OR ISNULL(@itemId, '') = '') OR 
    (FreightMethods.FreeTextItem = @itemId OR ISNULL(@itemId, '') = '') 

희망이 있습니다.

+0

이것은 호스트 매개 변수의 SQL Server 브랜드입니다 (familliar가 아님). 'OR @itemId IS NULL'을 대신 사용할 수 있습니까? 그냥 궁금해서. 또한'@ itemId' 절을 추출 할 수 있어야하므로 한 번만 검사하면됩니다. –

관련 문제