Я пишу 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
.
Я ожидаю, что условие должно выполняться, только если параметр входного значенияколичество больше нуля.