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时转换失败.
让我们创建一个包含列的表
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然后命令Val和Seq 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)
这是一个现场演示
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |