具有多列的Order by子句的语法不正确

SRa*_*wat 1 sql t-sql sql-server case sql-order-by

如何在case语句中编写带有多列的order by子句?

 ORDER BY 
 CASE 
 WHEN @T='ABC' Then Val,Seq
 ELSE Seq END
Run Code Online (Sandbox Code Playgroud)

也试过了

 ORDER BY 
 CASE 
 WHEN @T='ABC' Then Convert(int,Val) 
 WHEN @T='ABC' Then Convert(nvarchar,Seq)
 ELSE Seq END

 ORDER BY 
 CASE 
 WHEN @T='ABC' Then Val,Seq
 ELSE Seq END
Run Code Online (Sandbox Code Playgroud)

以下给出的代码也会抛出错误:

"此语句出错:"在执行存储过程时,将nvarchar值'EX-02-60'转换为数据类型int时转换失败.

Sam*_*ami 7

让我们创建一个包含列的表

CREATE TABLE T(
  Val VARCHAR(45),
  Seq INT,
  Sequence INT
);

INSERT INTO T VALUES
('A', 1, 2),
('C', 2, 1),
('B', 3, 3);
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看你的代码然后带来条件:

这是你的代码:

 ORDER BY 
 CASE 
 WHEN @T='ABC' Then Val,Seq
 ELSE Sequence END
Run Code Online (Sandbox Code Playgroud)
  • 如果@T = 'ABC然后命令ValSeq AND不按顺序排序Sequence.
  • 如果@T <> 'ABC'再下订单只有Sequence.

如果您运行此查询:

--You was trying--

DECLARE @T VARCHAR(3) = 'ABC'; --wil works only when @T <> ABC

SELECT *
FROM T
ORDER BY CASE WHEN @T='ABC' THEN Seq END, --Take INT
         CASE WHEN @T='ABC' THEN Val --Take Varchar
              ELSE Sequence -- Take INT
         END;
Run Code Online (Sandbox Code Playgroud)

如果,它将抛出以下错误 @T = 'ABC'

Msg 245 Level 16 State 1 Line 5

将varchar值'A'转换为数据类型int时转换失败.

和你一样

将nvarchar值'EX-02-60'转换为数据类型int时转换失败.

现在,根据您提供的条件,这是您想要的:

--Fixes--

DECLARE @T VARCHAR(3) = '1'; --Try to change it to ABC too

SELECT *
FROM T
ORDER BY CASE WHEN @T='ABC' THEN Val END, --Take varchar
         CASE WHEN @T='ABC' THEN Seq -- Take INT
              ELSE Sequence -- Take INT
         END;
/*
 IF @T = ABC
 ORDER BY Val, Seq; NOT Sequence

 IF @T <> ABC
 ORDER BY ONLY Sequence
*/
Run Code Online (Sandbox Code Playgroud)

这是一个现场演示