gpt4 book ai didi

sql - 使用字母数字和仅字母值的混合对 SQL 中的字母数字列进行排序

转载 作者:行者123 更新时间:2023-12-05 05:17:43 26 4
gpt4 key购买 nike

我有一个要求,我必须按字母数字列在 SQL 查询中应用排序,以便其中的值按如下方式排序:

AD
AH
AK1
B1
B2
B3x
B3y
B11
C1
C6
C12x
UIP

代替默认方式:

AD
AH
AK1
B1
B11
B2
B3x
B3y
C1
C12x
C6
UIP

我能够编写以下 SQL 语句:

SELECT [MyColumn]
FROM [MyTable]
ORDER BY
LEFT([MyColumn], PATINDEX('%[0-9]%', [MyColumn]) - 1),
CONVERT(INT, SUBSTRING([MyColumn], PATINDEX('%[0-9]%', [MyColumn]), LEN([MyColumn]) - (PATINDEX('%[0-9]%', REVERSE([MyColumn]))))),
RIGHT([MyColumn], PATINDEX('%[0-9]%', [MyColumn]) - 1)

我只需要知道如何以有条件的方式实现它,这样它就不会被仅 alpha 值触发,否则它会给出错误,或者是否有办法让它也能与它一起工作?

附言环境为SQL Server 2014。

最佳答案

看起来有点乱,我同意 Sean Lange 的观点,你应该考虑在多个字段中记录这一点,但你可以在你的 中使用 case 表达式order by 有条件排序:

declare @t table(c nvarchar(10));
insert into @t values('AD'),('AH'),('AK1'),('B1'),('B2'),('B3x'),('B3y'),('B11'),('C1'),('C6'),('C12x'),('UIP');

select c
from @t
order by
case when patindex('%[0-9]%', c) = 0
then c
else left(c, patindex('%[0-9]%', c) - 1)
end
,case when patindex('%[0-9]%', c) = 0
then 0
else convert(int,substring(c,patindex('%[0-9]%', c),len(c) - (patindex('%[0-9]%', reverse(c)))))
end
,right(c,case when patindex('%[0-9]%', c) = 0
then 0
else patindex('%[0-9]%', c) - 1
end
);

输出:

+------+
| c |
+------+
| AD |
| AH |
| AK1 |
| B1 |
| B2 |
| B3x |
| B3y |
| B11 |
| C1 |
| C6 |
| C12x |
| UIP |
+------+

关于sql - 使用字母数字和仅字母值的混合对 SQL 中的字母数字列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com