TSQL:基于参数值

时间:2015-11-11 14:34:34

标签: sql-server tsql where-clause case-when

我有一个WHERE子句需要根据参数交换值。我写的是给了我:

  

在a的上下文中指定的非布尔类型的表达式   条件是预期的。

此外,还有另一个参与影响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?...

2 个答案:

答案 0 :(得分:1)

以下是更正的查询:

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 

答案 1 :(得分:1)

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