在 SQL Server 2008 中简化单个查询中的条件

Simplyfing conditional in one single query in SQL Server 2008

如何在单个查询中简化以下 T-SQL 语句?

IF @OrderByDescription = 1
BEGIN
    SELECT d.DeptId, Description
    FROM Dept d 
    LEFT JOIN DeptOrder o ON p.DeptId = o.DeptId
    WHERE d.DeptId IN (3, 7, 9, 10, 17, 20)
    ORDER BY Description
END
ELSE
BEGIN
    SELECT d.DeptId, Description
    FROM Dept d 
    LEFT JOIN DeptOrder o ON p.DeptId = o.DeptId
    WHERE d.DeptId IN (3, 7, 9, 10, 17, 20)
    ORDER BY
        CASE WHEN o.[Order] IS NULL THEN 1
             ELSE 0
        END, o.[Order]
END

试试这个:

SELECT  d.DeptId, Description
FROM    Dept d LEFT JOIN DeptOrder o on p.DeptId = o.DeptId
WHERE   d.DeptId IN (3, 7, 9, 10, 17, 20)
ORDER BY 
   CASE 
      WHEN @OrderByDescription = 1 THEN Description
      ELSE 1
   END,
   CASE 
      WHEN o.[Order] IS NULL THEN 1                                            
      ELSE 0
   END, 
   o.[Order]

将您的 IF 条件移动到一个 CASE 中,然后将您的另一个 CASE 嵌套在其中。

SELECT
  d.DeptId
 ,Description
FROM
  Dept AS d
  LEFT JOIN
    DeptOrder AS o
      ON
      p.DeptId = o.DeptId
WHERE
  d.DeptId IN
    ( 3, 7, 9, 10, 17, 20 )
ORDER BY
  CASE
    WHEN @OrderByDescription = 1 THEN Description
    ELSE CASE
           WHEN o.[Order] IS NULL THEN 1
           ELSE 0
         END
  END
 ,o.[Order];

试试这个。

DECLARE @OrderByDescription INT = 1;

WITH CTE_Order
AS (
    SELECT d.DeptId
        ,Description
        ,CASE 
            WHEN @OrderByDescription = 1
                THEN ROW_NUMBER() OVER (
                        ORDER BY Description
                        )
            ELSE ROW_NUMBER() OVER (
                    ORDER BY CASE 
                            WHEN o.[Order] IS NULL
                                THEN 1
                            ELSE 0
                            END
                        ,o.[Order]
                    )
            END RowNum
    FROM Dept d
    LEFT JOIN DeptOrder o ON p.DeptId = o.DeptId
    WHERE d.DeptId IN (
            3
            ,7
            ,9
            ,10
            ,17
            ,20
            )
    )
SELECT *
FROM CTE_Order
ORDER BY RowNum