2016-11-18 2 views
0

У меня есть список номеров в формате строки, которые выглядят следующим образом:Как лексикографически сортировать числа, хранящиеся в строке?

1-1
1-11
1-12
1-2
1-21
1-2-31

Я хочу его сортировать так, чтобы получить результат в нижнем формате.

1-1
1-2
1-2-31
1-11
1-12
1-21

Я должен это сделать сортировку в улье. Как я могу это достичь?

+1

Вырезать первую подстроку с использованием разделителя '-', преобразовать в int, то же самое для второй части. Для этой операции должны быть некоторые функции. – Mihai

+0

Значит, вы не хотите лексикографического заказа. –

+0

В строке порядок по умолчанию - лексикографический. Поэтому вы добавляете ORDER BY yourfield, чтобы получить желаемый результат –

ответ

1

Попробуйте так:

Сначала я использую объявленные переменные таблицы в виде ** макета * для тестового сценария.

CTE сократит числа в дефис. Затем используйте номер на обеих частях отдельно.

DECLARE @tbl TABLE(StringNumber VARCHAR(10)); 
INSERT INTO @tbl VALUES 
('1-1') 
,('1-2') 
,('1-11') 
,('1-12') 
,('1-21'); 

WITH Parted AS 
(
    SELECT LEFT(StringNumber,pos.Hyph-1) AS PartOne 
      ,SUBSTRING(StringNumber,pos.Hyph+1,1000) AS PartTwo 
      ,StringNumber 
    FROM @tbl AS tbl 
    CROSS APPLY(SELECT CHARINDEX('-',StringNumber)) AS Pos(Hyph) 
) 
SELECT * FROM Parted 
ORDER BY CAST(PartOne AS INT),CAST(PartTwo AS INT) 
+0

Извините, я ответил быстро ... Не понял, что это не был SQL-сервер. Я дал свой ответ здесь, так как вы видите общий подход и наверняка сможете перенести эту концепцию ... – Shnugo

+0

Этот CTE кажется идеальным. Но моя колонка фактически содержит переменное число чисел, разделенных дефисом. Как я могу сделать ваш динамический код для размещения этого. например, могут существовать такие значения, как 3-1-3-2, 2-1-3-28-7. –

+0

@SakshamArora У меня нет опыта работы с вашими инструментами. В SQL Server можно использовать какой-то «набор строк» ​​(v2016 + изначально, ниже с XML, рекурсивный CTE или цикл). Будет ли это работать для вас? Найти что-то подобное (синтаксис SQL-Server) [здесь] (http://stackoverflow.com/a/37061143/5089204) или [здесь] (http://stackoverflow.com/a/32733141/5089204) – Shnugo

Смежные вопросы