首页 > 解决方案 > 在where子句中使用带有临时表的案例表达式?

问题描述

StatusId是一个逗号分隔的字符串。如果StatusId为“0”,则应获取所有行。否则我需要加入临时表#StatusIdVal并且只应该获取相关记录。

CREATE Procedure TestSchema.GetDetails
(
    @StatusId   Varchar(MAX)
)
As
Begin
SET NOCOUNT ON

    IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
    BEGIN
      DROP TABLE #TempStatusVal
    END

    Create Table #TempStatusVal (StatusId Int Primary Key)

    Insert into #TempStatusVal (StatusId)
    SELECT Distinct ITEMS FROM TestSchema.SPLIT(@StatusId, ',')

    Select  *
    From TestSchema.tblDetails TD with (NoLock)
    Where TD.StatusId In (Select Case When @StatusId = '0' Then TD.StatusId Else (Select StatusId From #TempStatusVal) End)

    IF OBJECT_ID('tempdb.dbo.#TempStatusVal') IS NOT NULL
    BEGIN
      DROP TABLE #TempStatusVal
    END

SET NOCOUNT OFF
End
GO

我可以理解,如果#TempStatusVal有多个记录返回异常

子查询返回超过 1 个值,这是不允许的

我怎样才能做到这一点?

标签: sqlsql-serverstored-procedures

解决方案


您可能需要这样的WHERE条款

WHERE @StatusId = '0'
OR EXISTS (SELECT 1 FROM #TempStatusVal WHERE TD.StatusId = StatusId)

推荐阅读