Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQLServer2008中在一个查询中简化条件_Sql Server_Sql Server 2008_Sql Order By_Case - Fatal编程技术网

Sql server 在SQLServer2008中在一个查询中简化条件

Sql server 在SQLServer2008中在一个查询中简化条件,sql-server,sql-server-2008,sql-order-by,case,Sql Server,Sql Server 2008,Sql Order By,Case,如何在一个查询中简化下面的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.

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