按字母数字DB2语法排序的WinSQL
我有以下一组数据:按字母数字DB2语法排序的WinSQL,db2,db2-400,winsql,Db2,Db2 400,Winsql,我有以下一组数据: 33 5A 5B 12 34A 2 34B 2B 11 10 12A 在WinSQL中运行以下SQL时: with input (f) as ( values ('33'), ('5A'), ('5B'),('12'), ('34A'),('2'), ('34B'), ('2B'), ('11'), ('10'), ('12A') ) SELECT f FROM input ORDER BY f 我得到以下结果: 10 11 12 12A 2 2B 33 34A
33
5A
5B
12
34A
2
34B
2B
11
10
12A
在WinSQL中运行以下SQL时:
with input (f) as (
values ('33'), ('5A'), ('5B'),('12'), ('34A'),('2'), ('34B'), ('2B'), ('11'), ('10'), ('12A')
)
SELECT f
FROM input
ORDER BY f
我得到以下结果:
10
11
12
12A
2
2B
33
34A
34B
5A
5B
但是,我希望结果按以下顺序排列:
2
2B
5A
5B
10
11
12
12A
33
34A
34B
我尝试了以下方法:
with input (f) as (
values ('33'), ('5A'), ('5B'),('12'), ('34A'),('2'), ('34B'), ('2B'), ('11'), ('10'), ('12A')
)
SELECT
f
FROM input
ORDER BY CAST(CASE
WHEN f LIKE '[0-9]' THEN LEFT(CONCAT(0,f),1)
WHEN f LIKE '[0-9]%' THEN LEFT(CONCAT(0,f),1)
WHEN f LIKE '[0-9][0-9]%' THEN LEFT(f ,2)
ELSE NULL
END AS INT), f
但它不起作用
注意:这是针对DB2的,所有SQL server函数(如PATINDEX、SIGNED/UNSIGNED)都不可用 试试这个:
ORDER BY CAST(replace(replace(replace(f,'A',''),'B',''),' ','') AS INT), f
(也就是说,通过去掉非数字元素来构造一个排序字段&转换为数字,然后使用原始值进行绑定)。Db2服务器是在Z/OS、i-Series还是Linux/Unix/Windows上运行的?排序顺序决定排序顺序。是否所有值都遵循以下模式:
[0-9]{1,2}[A-Z]?
?DB2服务器正在iSeries上运行@是的@穆斯塔乔