Используйте оператор IN в THEN Statement в SQL - PullRequest
0 голосов
/ 28 октября 2019

Я пишу SQL-оператор, который будет получать информацию из табличного параметра на основе входных данных, указанных в хранимой процедуре. Условие должно работать, если число строк входного значения больше нуля. Пожалуйста, укажите мне следующий запрос.

DECLARE @DivisionIds [dbo].[IDList]
DECLARE @StateIds [dbo].[IDList]

INSERT INTO @DivisionIds Values (1)
INSERT INTO @DivisionIds Values (1)
INSERT INTO @StateIds Values (1)
INSERT INTO @StateIds Values (3)
INSERT INTO @StateIds Values (31)
INSERT INTO @StateIds Values (43)

SET @DivsionRowCount = (SELECT COUNT(ID) FROM @DivisionIds)
SET @StateRowCount = (SELECT COUNT(ID) FROM @StateIds)

SELECT * FROM MedInv inv INNER JOIN Location loc ON inv.MedInvID = loc.MedInvID 
WHERE CustomerID = 210
AND
    @DivsionRowCount > 0 AND loc.DivisionID IN (SELECT ID FROM @DivisionIds)
AND
    @StateRowCount > 0 AND loc.StateID IN (SELECT ID FROM @StateIds)

Приведенный выше код работает нормально, если я предоставлю значение для @DivisionIds и @StateIds. В некоторых сценариях @DivisionIds и StateIds не имеют никаких значений. Таким образом, количество строк будет равно нулю. Я хочу выполнить вышеуказанное условие, только если число строк больше нуля. Как это сделать?

Мой фактический код содержит инструкцию CASE для других условий, я хочу включить вышеуказанное условие в инструкцию CASE, я пробовал следующий подход, но получаю ошибку.

DECLARE @DivisionIds [dbo].[IDList]
DECLARE @StateIds [dbo].[IDList]

SET @DivsionRowCount = (SELECT COUNT(ID) FROM @DivisionIds)
SET @StateRowCount = (SELECT COUNT(ID) FROM @StateIds)

SELECT CustomerName, InvEstValue, Status FROM MedInv inv
INNER JOIN Location loc ON loc.MedInvID = inv.MedInvID
INNER JOIN Division div ON div.DivisionID = loc.DivisionID
INNER JOIN State st ON st.StateID = loc.StateID
WHERE inv.CustomerID = 210
AND
inv.CustomerName Like
CASE WHEN @CustomerName = '' THEN '%%' ELSE '%' + @CustomerName + '%' END
AND
   inv.AssetDescription Like
   CASE WHEN @AssetDescription = '' THEN '%%' ELSE '%' + @AssetDescription + '%' END
AND
    @DivsionRowCount > 0 AND loc.DivisionID IN (SELECT ID FROM @DivisionIds)
AND
    @StateRowCount > 0 AND loc.StateID IN (SELECT ID FROM @StateIds)
AND
    loc.DivisionID = 
    CASE WHEN (@DivsionRowCount > 0) THEN loc.DivisionID IN (SELECT ID FROM @DivisionIds) ELSE loc.DivisionID END

Исходя из вышесказанного, я получаю сообщение об ошибке рядом с ключевыми словами IN и ELSE, говорящими о том, что неправильный синтаксис рядом с IN, неправильный синтаксис рядом с ELSE. Ожидается END ИЛИ THEN.

Пожалуйста, объясните мне, как использовать оператор IN в операторе THEN.

Я ожидаю, что условие должно выполняться, только если параметр входного значенияколичество больше нуля.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Вот как я бы написал:

DECLARE @DivisionIds [dbo].[IDList]
DECLARE @StateIds [dbo].[IDList]

SET @DivsionRowCount = (SELECT COUNT(ID) FROM @DivisionIds)
SET @StateRowCount = (SELECT COUNT(ID) FROM @StateIds)

SELECT CustomerName, InvEstValue, Status 
FROM MedInv inv
INNER JOIN Location loc 
    ON loc.MedInvID = inv.MedInvID
INNER JOIN Division div 
    ON div.DivisionID = loc.DivisionID
INNER JOIN State st 
    ON st.StateID = loc.StateID
WHERE inv.CustomerID = 210
AND (@CustomerName = '' OR inv.CustomerName Like '%' + @CustomerName + '%')
AND (@AssetDescription = '' OR inv.AssetDescription LIKE '%' + @AssetDescription + '%')

AND (@DivsionRowCount = 0 OR loc.DivisionID IN (SELECT ID FROM @DivisionIds))
AND (@StateRowCount = 0 OR loc.StateID IN (SELECT ID FROM @StateIds))

Возможно, вы захотите добавить опцию (перекомпилировать), если у вас проблемы с производительностью. За подробностями обращайтесь к повторным запросам на все запросы к SQL в диком блоге.

0 голосов
/ 28 октября 2019

Я не уверен, что вы подходите правильно с вашим случаем, когда в вашем состоянии, но проблема в том, что у вас с вашим последним состоянием у вас будет что-то вроде:

loc.DivisionID = in(...)

И "=в "неверный синтаксис

Может быть, вы можете добавить свое условие непосредственно в объединение

INNER JOIN Division div ON loc.DivisionID IN (SELECT ID FROM @DivisionIds)

Это то, что вы ожидали? Но я думаю, что вам нужно также поместить эти 2 условия в соединение

AND
    @DivsionRowCount > 0 AND loc.DivisionID IN (SELECT ID FROM @DivisionIds)
AND
    @StateRowCount > 0 AND loc.StateID IN (SELECT ID FROM @StateIds)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...