我正在使用 SQL Server 2008 R2。
我想按我作为字符串保存的特定顺序对结果进行排序
(字符串是以编程方式创建的)。
考虑这张表:
Col1 Col2 Col3
1 Jon a
2 Joan b
3 John a
4 Jonnie b
5 Jonny a
我有一个nvarchar
声明为 的变量@myOrderString
,其中包含我要选择的行的顺序。
让我们这么说@myOrderString = '213'
(编辑)
所以,我想做这样的事情:
SELECT
ROW_NUMBER() OVER (ORDER BY @mySortString) AS Row,
( Col2 + '(' + Col1 + ')' ) AS Outcome
FROM
myTable
WHERE
Col3 = 'a'
ORDER BY
@mySortString
为了得到结果:(已编辑)
Row Outcome
1 John (3)
2 Jon (1)
3 Jonny (5)
我什至如何开始解决这个问题?
附言
如果中的值@myOrderString
应该分开,我可以做到@myOrderString = '2,1,3'
(编辑)
编辑问题的原因:
- 字符串内容有错误。[标记为(已编辑)]
- 结果出现错误。感谢 Andriy M. [标记为(已编辑)]
- 我添加了外观更改并更正了一些语法和拼写错误。
澄清:(此澄清的一部分基于 Aaron Bertrand 的评论)
- 字符串中的值数始终与结果中的行数匹配。
- 字符串中的值始终是从 1 到行数的数字。
- 第一个结果的行标记为 1;第二个标记为 2,第三个标记为 3。现在,该字符串用于对结果进行重新排序。当字符串
2,1,3
为时表示选择结果被重新排序:第二行现在将作为第一行,第一个结果将显示为第二,第三行将保持第三 - 最大行数为 15,因此字符串可以是形式
123456789ABCDEF
,或者如果这种简化形式的解决方案不简单,则字符串可以是形式1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
感谢这里和那里的许多人,我已经达到了以下解决方案:
(不需要函数或循环)
-- creating the original table and filling it
DECLARE @t TABLE(Col1 INT, Col2 VARCHAR(22), Col3 CHAR(1));
INSERT @t VALUES
(1,'Jon', 'a'),
(2,'Joan', 'b'),
(3,'John', 'a'),
(4,'Jonnie','b'),
(5,'Jonny', 'a');
-- this is the required order of the results
DECLARE @myOrderString VARCHAR(32) = '213';
-- this is my current solution
SELECT
ROW_NUMBER()OVER (ORDER BY CHARINDEX(CAST(rr AS NVARCHAR(MAX)), @myOrderString)) As [Row],
Outcome
FROM
(
SELECT
ROW_NUMBER()OVER (ORDER BY Col1) AS rr,
Col2 + ' (' + CONVERT(NVARCHAR(22),Col1)+ ')' AS Outcome
FROM @t
WHERE Col3 = 'a'
) as r
ORDER BY
[Row]
但是,它最多可以处理 9 行结果,而我最多可以使用 15 行来表示表单123456789ABCDEF
。
我尝试通过使用对结果的行号使用 Dec 到 Hex 转换CONVERT(CHAR(1),CONVERT(VARBINARY(1),@Dec))
,但没有运气。
是否有一个简单的更正可以使它起作用?
一个长示例(超过 9 行)
为了测试超过 9 行的示例,我使用以下命令:
-- creating the original table and filling it
DECLARE @t TABLE(Col1 INT, Col2 VARCHAR(22), Col3 CHAR(1));
INSERT @t VALUES
(1,'Jon', 'a'),
(2,'Joan', 'b'),
(3,'John', 'a'),
(4,'Jonnie','b'),
(5,'Jonny', 'a'),
(6,'Don', 'a'),
(7,'Doan', 'b'),
(8,'Dohn', 'a'),
(9,'Donnie','b'),
(10,'Donny', 'a'),
(11,'Gon', 'a'),
(12,'Goan', 'a'),
(13,'Gohn', 'a'),
(14,'Gonnie','a'),
(15,'Gonny', 'a');
-- this is the required order of the results
DECLARE @myOrderString VARCHAR(32) = '456B213A789';
一个完整的解决方案:
我将在这里使用答案部分的循环提供我的完整解决方案,而不将其作为答案。