在 SQL 中对字符串进行逻辑排序,其中数字部分按数值排序

问题描述 投票:0回答:1

我有一个包含

11
101
ST-1001
ST-100
等代码的表,我想对数据进行排序,以便整数部分按整数值排序。但问题是它也与 string/varchar 部分混合在一起。

那么,MS-SQL 中是否可以像 Windows StrCmpLogicalW dll 函数一样“逻辑”地对代码进行排序?

我尝试使用

CASE
语句对其进行排序,但我认为如果必须考虑所有不同的字符串前缀,这会变得太复杂。请参阅下面的示例代码。

CREATE TABLE metaforms (
    Code varchar(10),
    Description varchar(25),
    Variables integer
);
GO

INSERT INTO metaforms (
    Code,
    Description,
    Variables
) VALUES
('1', 'testform', 143),
('10015', 'measurement', 16),
('1020006510', 'Nutrition history', 50),
('1010010006', 'Translator', 8),
('10200310', 'Delivery Details: I', 13),
('10200320', 'Delivery Details: III', 12),
('10200330', 'Delivery Details: III', 12),
('1020100001', 'Comfort and Hygiene', 10),
('1020100025', 'Car Seat Evaluation', 7),
('1020100053', 'Length Weight', 7),
('AMB-100', 'AMB SF SA-DIABETES', 5),
('AMB-34', 'AMB SF SA-CHEST', 5),
('AMB-99', 'AMB SF SA-COUGH', 5),
('LQF-3912', 'DLBX-M DIAGNOSTICS (3912)', 21),
('LQF-40', 'DLBX-M DIAGNOSTICS (40)', 24),
('LQF-588', 'DLBX-M DIAGNOSTICS (588)', 34),
('ST-1010', 'Standard form 1010', 9),
('ST-200', 'Standard form 200', 9),
('ST-35', 'Standard form 35', 9);

select * from metaforms
order by case when isnumeric(code)=1 then right('000000000000'+code, 12) else code end

上面代码中的

select
可以正确排序数值,但不能正确排序也有字符串部分的代码。

所以想要的排序结果应该是这样的:

Code
-----------
1
10015
10200310
10200320
10200330
1010010006
1020006510
1020100001
1020100025
1020100053
AMB-34
AMB-99
AMB-100
LQF-40
LQF-588
LQF-3912
ST-35
ST-200
ST-1010
sql sorting alphanumeric
1个回答
0
投票

如果您的所有数据确实与显示的模式

^([A-Z]*-|)[0-9]+$
匹配,我们可以利用也表示负数的
-
。因此,我们不要乱搞“charindex + 1”之类的东西,而是取绝对值。

select *
from #metaforms
order by substring(code, 1, charindex('-', Code))
    , abs(substring(code, charindex('-', Code), 999999999))

输出:

1
10015
10200310
10200320
10200330
1010010006
1020006510
1020100001
1020100025
1020100053
AMB-34
AMB-99
AMB-100
LQF-40
LQF-588
LQF-3912
ST-35
ST-200
ST-1010
© www.soinside.com 2019 - 2024. All rights reserved.