SQL: если var = '' больше ничего не делать, добавить условие в предложение WHERE - PullRequest
1 голос
/ 22 сентября 2011

Я хотел бы выполнить одну часть предложения 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

У кого-нибудь есть идеи, где я ошибаюсь?

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Если я неправильно понимаю, пожалуйста, дайте мне знать, я предполагаю, что если у вас есть пустой @itemID, вам нужны все результаты, иначе вы ограничите результаты.иметь правильные скобки, но они могут быть неровными.Надеюсь, это достаточно ясно, чтобы понять мои намерения.

1 голос
/ 22 сентября 2011
...
WHERE
1 = CASE WHEN ... THEN 1 ELSE 0 END
...
0 голосов
/ 22 сентября 2011

Насколько я понимаю, вы должны сделать что-то вроде ниже.

     (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 голосов
/ 22 сентября 2011

Возможно, вы могли бы использовать 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
...