简体   繁体   中英

Use case expression with temp table in where clause?

StatusId is a comma separated string. If StatusId is '0' then all rows should be fetched. Otherwise I need to join with temp table #StatusIdVal and relevant records should only be fetched.

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

I can understand that if #TempStatusVal have more than one records returning an exception

subquery return more than 1 value this is not permitted

How can I achieve this?

You may need to WHERE clause like this

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

You can achieve it in this way

Select  *
From TestSchema.tblDetails TD with (NoLock)
Where @StatusId = '0' or TD.StatusId In (Select t.StatusId From #TempStatusVal t)

Instead of making it complex add one more query to return data when @StatusId <> '0'

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)

    Select  TD.StatusId
    From TestSchema.tblDetails TD with (NoLock)
    Where @StatusId = '0'

    union all

    Select  TD.StatusId
    From #TempStatusVal TD with (NoLock)
    Where @StatusId <> '0'


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

SET NOCOUNT OFF
End
GO
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 @StatusId   When  '0' Then TD.StatusId Else  StatusId  End
    From #TempStatusVal
    )

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

SET NOCOUNT OFF
End
GO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM