Sql server 在SQL中使用IN运算符IN THEN语句

Sql server 在SQL中使用IN运算符IN THEN语句,sql-server,Sql Server,我正在编写一个SQL语句,它将根据存储过程中给定的输入从表值参数中获取信息。如果输入值行计数大于零,则该条件应起作用。请用下面的问题指导我 DECLARE @DivisionIds [dbo].[IDList] DECLARE @StateIds [dbo].[IDList] INSERT INTO @DivisionIds Values (1) INSERT INTO @DivisionIds Values (1) INSERT INTO @StateIds Values (1) INSER

我正在编写一个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
从上面来看,我在和ELSE关键字中的
附近发现了一个错误,即
中的
附近的语法不正确,
ELSE附近的语法不正确
。应为
结束
然后

请指导我如何在
中使用
运算符,然后在
语句中使用


我希望只有当输入值参数计数大于零时,该条件才会运行。

我不确定您在您的条件下是否采取了正确的方法,但是 问题是,如果您患有上一种疾病,您会出现如下情况:

loc.DivisionID = in(...)
和“=in”是不正确的语法

也许你可以直接在join中添加你的条件

INNER JOIN Division div ON loc.DivisionID IN (SELECT ID FROM @DivisionIds)
这是你期望的吗? 但是我认为你也需要把这两个条件放在连接中

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

我会这样写:

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))
如果出现性能问题,可能需要添加选项(重新编译)。
有关详细信息,请查看wild blog中的SQL。

出现错误是因为您试图像子查询一样获取loc.DivisionID,这是不正确的。您不能将case用作流控制。这是一个返回单个值的表达式。我如何实现它?感谢Carbon提供的解决方案。内部连接符合我的要求。