Используйте выражение case с временной таблицей в предложении where? - PullRequest
0 голосов
/ 11 февраля 2020

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 значения, это не разрешено

Как мне этого добиться?

Ответы [ 4 ]

2 голосов
/ 11 февраля 2020

Вы можете достичь этого таким образом

Select  *
From TestSchema.tblDetails TD with (NoLock)
Where @StatusId = '0' or TD.StatusId In (Select t.StatusId From #TempStatusVal t)
2 голосов
/ 11 февраля 2020

Возможно, вам понадобится WHERE предложение вроде этого

WHERE @StatusId = '0'
OR EXISTS (SELECT 1 FROM #TempStatusVal WHERE TD.StatusId = StatusId)
0 голосов
/ 11 февраля 2020
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
0 голосов
/ 11 февраля 2020

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