SQL Server - сортировка столбца по строке и номеру - PullRequest
0 голосов
/ 14 марта 2019

У меня есть таблица с одним столбцом, которая содержит комбинацию строки и числа, как показано ниже. Мне нужно отсортировать столбец имени по убыванию или по возрастанию, но проблема в том, что когда я использую ORDER BY, он сортируется не так, как ожидалось

enter image description here

Мой запрос похож на показанный ниже

SELECT * FROM test ORDER BY `name` ASC

Мой ожидаемый результат похож на показанный удар

employee1
employee2
employee3
employee6
employee6
employee10
employee11
employee12
employee17
employee82
employee100
employee111
employee129
employee299

Может кто-нибудь, пожалуйста, помогите мне в этом

Ответы [ 4 ]

0 голосов
/ 14 марта 2019

«Базовая» часть имени одинакова. Итак, вы можете заказать по длине, а затем по имени:

SELECT t.*
FROM test t
ORDER BY LEN(name), name;
0 голосов
/ 14 марта 2019

Поскольку номер всегда в конце, вы можете сделать как

WITH CTE AS
(
SELECT 'employee1' Name
union all select 'employee2'
union all select 'employee3'
union all select 'employee6'
union all select 'employee6'
union all select 'employee10'
union all select 'employee11'
union all select 'employee12'
union all select 'employee17'
union all select 'employee82'
union all select 'employee100'
union all select 'employee111'
union all select 'employee129'
union all select 'employee299'
)
SELECT Name
FROM CTE
ORDER BY CAST(SUBSTRING(Name, PATINDEX('%[^a-z, '' '']%', Name), LEN(Name)) AS INT)
--OR PATINDEX('%[0-9]%', Name)

Или

WITH CTE AS
(
SELECT 'The First Employee 1' Name
union all select 'The Second One 2'
union all select 'Employee Number 4'
union all select 'Employee Number 3'
)
SELECT Name
FROM CTE
ORDER BY CAST(SUBSTRING(Name, PATINDEX('%[0-9]%', Name), LEN(Name)) AS INT)

Вот Live Demo , где вы можете изменить строки и посмотреть результаты.

Finnaly, я бы обратил внимание на реальную проблему: таблица с одним столбцом и без PK .

0 голосов
/ 14 марта 2019

Пожалуйста, попробуйте код ниже:

-- ASSUMES NUMBERS ARE IN THE LAST CHARACTER
-- WONT WORK IF NUMBER IS THERE IN THE MIDDLE

DROP TABLE IF EXISTS #data

select 
 Name        = REPLACE(name,' ','') 
,NameWithNum = REPLACE(name,' ','') + cast(object_id as varchar(100))
INTO #data
from sys.tables

SELECT 
 NameWithNum
,NameRemovedNumbers= SUBSTRING(NameWithNum, PATINDEX('%[0-9]%', NameWithNum), LEN(NameWithNum))
from #data
ORDER BY Name,SUBSTRING(NameWithNum, PATINDEX('%[0-9]%', NameWithNum), LEN(NameWithNum))
0 голосов
/ 14 марта 2019

Вы можете попробовать ниже, только извлекая числовую часть из поля

SELECT * FROM test 
ORDER BY cast(replace(`name`,'employee','') as int) ASC
...