【问题标题】:Simplyfing conditional in one single query in SQL Server 2008在 SQL Server 2008 中的单个查询中简化条件
【发布时间】:2018-07-27 13:21:29
【问题描述】:

如何在一个查询中简化下面的 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

【问题讨论】:

    标签: sql-server sql-server-2008 sql-order-by case


    【解决方案1】:

    将您的 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];
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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]
      

      【讨论】:

        【解决方案3】:

        试试这个。

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-15
          • 2016-12-31
          相关资源
          最近更新 更多