Как отсортировать поле Varchar, содержащее такие данные, как ABC, ABC123,123 в SQL Server - PullRequest
1 голос
/ 17 октября 2019

У меня есть столбец section , который является varchar , и я пытаюсь sort таким образом, чтобы я получил результат, как показано ниже,

Section  
-------
1  
100  
11  
180a  
18a  
18b  
19B  
2  
A1  
A10  
A11  
A18  
A180  
A189  
A19  
A1B  
AB1  
AB10  
AB100  
Aquaman  
B1  
B2  
B20  
B21  
B3  
B32  
S  
Superman  

Я ожидаю, что результат будет таким, как показано ниже. сначала я получаю числа, отсортированные по возрастанию, затем альфа-числовые значения, а затем, наконец, значения символов.

Не будет проблемой, если сначала будут значения символов, затем буквенно-цифровые, а затем цифры.

Section
-------
1  
2  
11  
100  
18a  
18b  
19B  
180a  
A1  
A10  
A11  
A18  
A19  
A180  
A189  
A1B  
AB1  
AB10  
AB100  
B1  
B2  
B20  
B21  
B3  
B32  
Aquaman  
S  
Superman  

Я попробовал следующий запрос, с которым я приблизился к степени, но не совсем кчто я ожидаю.

SELECT Section
FROM dbo.Section_suw
ORDER BY
case  when ISNUMERIC(Section)=0 then Section else '0' end,
case when ISNUMERIC(Section)=1 then CONVERT(INT, Section) else -1 end

Демонстрационная таблица для тестирования,

CREATE TABLE dbo.Section_suw
(
       Section varchar(50) NULL
)

INSERT INTO dbo.Section_suw (Section.Section) VALUES ('1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('AB1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B2')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A11')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B20')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B21')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('AB10')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B3')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('AB100')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('2')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B32')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('11')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A10')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A1B')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A180')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A189')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('180a')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('18a')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('18b')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A18')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A19')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('19B')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('100')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('Superman')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('Aquaman')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('S')

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Попробуйте,

SELECT Section FROM dbo.Section_suw
ORDER BY
case when ISNUMERIC(Section)=0  then  iif(PATINDEX('%[0-9]%',Section)>0,Section,'z'+Section) else '0' end
0 голосов
/ 17 октября 2019

Это работает, пока вы используете версию SQL Server, которая поддерживает TRY_CAST (начиная с 2012 года)

SELECT Section
FROM dbo.Section_suw
ORDER BY ISNULL(TRY_CAST(Section as int),2147483647),Section

DBFiddle.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...