TSQL:基于参数值的条件 WHERE
TSQL: Conditional WHERE based on param value
我有一个 WHERE
子句部分需要根据参数交换值。我写的是给我:
An expression of non-boolean type specified on a context where a
condition is expected.
此外,还有另一个参数也会影响 Order By
,但我认为没关系。
这里是查询:
WHERE ( ISNULL(C.QtyCancel, 0) > 0
OR ISNULL(PR.QtyPrinted, 0) > 0
OR ISNULL(SH.QtyShipped, 0) + ISNULL(OI.QtyAssigned, 0) > 0
OR ISNULL(NP.[ID], 0) > 0
OR ISNULL(NP.[NG], 0) > 0
OR ISNULL(NP.[SS], 0) > 0
OR ISNULL(NP.[ZO], 0) > 0
)
--this is the problem line that errors
--AND CASE WHEN @IsAdmin <> 1 THEN 'AND TD.TempDate = ''01/01/1901''' END
GROUP BY CONVERT(NVARCHAR(10), TD.TempDate, 101)
WITH ROLLUP
ORDER BY CASE WHEN @Sort <> '' THEN @Sort
ELSE '[Date]'
END --<--will this work as well?...
这里是更正的查询:
WHERE ( ISNULL(C.QtyCancel, 0) > 0
OR ISNULL(PR.QtyPrinted, 0) > 0
OR ISNULL(SH.QtyShipped, 0) + ISNULL(OI.QtyAssigned, 0) > 0
OR ISNULL(NP.[ID], 0) > 0
OR ISNULL(NP.[NG], 0) > 0
OR ISNULL(NP.[SS], 0) > 0
OR ISNULL(NP.[ZO], 0) > 0
)
/*here is what you are trying to achieve*/
AND (@IsAdmin <> 1 AND TD.TempDate = '01/01/1901' OR @IsAdmin = 1)
GROUP BY CONVERT(NVARCHAR(10), TD.TempDate, 101)
WITH ROLLUP
ORDER BY CASE WHEN @Sort <> '' THEN @Sort
ELSE '[Date]'
END
WHERE ( C.QtyCancel > 0
OR PR.QtyPrinted > 0
OR ISNULL(SH.QtyShipped, 0) + ISNULL(OI.QtyAssigned, 0) > 0
OR NP.[ID] > 0
OR NP.[NG] > 0
OR NP.[SS] > 0
OR NP.[ZO] > 0
)
AND (@IsAdmin = 1 OR TD.TempDate = '01/01/1901')
GROUP BY CONVERT(NVARCHAR(10), TD.TempDate, 101)
WITH ROLLUP
-- no this will not work.
--ORDER BY CASE WHEN @Sort <> '' THEN @Sort
--ELSE '[Date]'
--END --<--will this work as well?...
在您的排序方式中,您可以检查值,然后在 Case 语句中选择您想要排序的字段,但您不能通过变量排序..
ORDER BY CASE @Sort WHEN 'QtyCancel' THEN C.QtyCancel
WHEN 'QtyPrinted' THEN PR.QtyPrinted
ELSE [Date]
END
我有一个 WHERE
子句部分需要根据参数交换值。我写的是给我:
An expression of non-boolean type specified on a context where a condition is expected.
此外,还有另一个参数也会影响 Order By
,但我认为没关系。
这里是查询:
WHERE ( ISNULL(C.QtyCancel, 0) > 0
OR ISNULL(PR.QtyPrinted, 0) > 0
OR ISNULL(SH.QtyShipped, 0) + ISNULL(OI.QtyAssigned, 0) > 0
OR ISNULL(NP.[ID], 0) > 0
OR ISNULL(NP.[NG], 0) > 0
OR ISNULL(NP.[SS], 0) > 0
OR ISNULL(NP.[ZO], 0) > 0
)
--this is the problem line that errors
--AND CASE WHEN @IsAdmin <> 1 THEN 'AND TD.TempDate = ''01/01/1901''' END
GROUP BY CONVERT(NVARCHAR(10), TD.TempDate, 101)
WITH ROLLUP
ORDER BY CASE WHEN @Sort <> '' THEN @Sort
ELSE '[Date]'
END --<--will this work as well?...
这里是更正的查询:
WHERE ( ISNULL(C.QtyCancel, 0) > 0
OR ISNULL(PR.QtyPrinted, 0) > 0
OR ISNULL(SH.QtyShipped, 0) + ISNULL(OI.QtyAssigned, 0) > 0
OR ISNULL(NP.[ID], 0) > 0
OR ISNULL(NP.[NG], 0) > 0
OR ISNULL(NP.[SS], 0) > 0
OR ISNULL(NP.[ZO], 0) > 0
)
/*here is what you are trying to achieve*/
AND (@IsAdmin <> 1 AND TD.TempDate = '01/01/1901' OR @IsAdmin = 1)
GROUP BY CONVERT(NVARCHAR(10), TD.TempDate, 101)
WITH ROLLUP
ORDER BY CASE WHEN @Sort <> '' THEN @Sort
ELSE '[Date]'
END
WHERE ( C.QtyCancel > 0
OR PR.QtyPrinted > 0
OR ISNULL(SH.QtyShipped, 0) + ISNULL(OI.QtyAssigned, 0) > 0
OR NP.[ID] > 0
OR NP.[NG] > 0
OR NP.[SS] > 0
OR NP.[ZO] > 0
)
AND (@IsAdmin = 1 OR TD.TempDate = '01/01/1901')
GROUP BY CONVERT(NVARCHAR(10), TD.TempDate, 101)
WITH ROLLUP
-- no this will not work.
--ORDER BY CASE WHEN @Sort <> '' THEN @Sort
--ELSE '[Date]'
--END --<--will this work as well?...
在您的排序方式中,您可以检查值,然后在 Case 语句中选择您想要排序的字段,但您不能通过变量排序..
ORDER BY CASE @Sort WHEN 'QtyCancel' THEN C.QtyCancel
WHEN 'QtyPrinted' THEN PR.QtyPrinted
ELSE [Date]
END