Упорядочивание по нечисловой строке иерархии численно - PullRequest
2 голосов
/ 28 июня 2011

У меня есть таблица с данными, представляющими древовидную структуру, с одним столбцом, указывающим положение строки в иерархическом дереве. Каждый уровень разделен -.

1
1-1
2
2-1
2-2
2-2-1
2-2-2
2-2-2-1

Дерево извлекается по порядку просто с ORDER BY в этом столбце. Это происходит, когда на любом уровне более 10 элементов, поскольку столбец отсортирован по алфавиту. MySQL сортирует 10 до 3.

Actual result:

1
1-10
1-3
2

Desired result:

1
1-3
1-10
2

Может быть любое количество уровней глубины для значений.

Можно ли отсортировать эти данные численно в MySQL?

1 Ответ

2 голосов
/ 28 июня 2011

Я думаю, что ваш лучший способ - преобразовать данные во что-то естественное. Если у вашей древовидной структуры всегда будет менее 99 дочерних элементов, вы можете создать функцию, подобную той, что была ниже. Вы бы просто использовали «GetTreeStructureSort (columnName)» в функции сортировки. (Если у вас есть возможность 3-значных чисел, вы можете отрегулировать это, чтобы сделать его более интуитивным.)

CREATE FUNCTION GetTreeStructureSort
(
    -- Add the parameters for the function here
    @structure varchar(500) 
)
RETURNS varchar(500)
AS
BEGIN

    DECLARE @sort varchar(500)

    -- Add a hyphen to the beginning and end to make all the numbers from 1 to 9 easily replaceable
    SET @sort = '-' + @structure + '-'

    -- Replace each instance of a one-digit number to a two-digit representation
    SELECT @sort = REPLACE(@sort, '-1-', '-01-')
    SELECT @sort = REPLACE(@sort, '-2-', '-02-')
    SELECT @sort = REPLACE(@sort, '-3-', '-03-')
    SELECT @sort = REPLACE(@sort, '-4-', '-04-')
    SELECT @sort = REPLACE(@sort, '-5-', '-05-')
    SELECT @sort = REPLACE(@sort, '-6-', '-06-')
    SELECT @sort = REPLACE(@sort, '-7-', '-07-')
    SELECT @sort = REPLACE(@sort, '-8-', '-08-')
    SELECT @sort = REPLACE(@sort, '-9-', '-09-')

    -- Strip off the first and last hyphens that were added at the beginning.
    SELECT @sort = SUBSTRING(@sort, 2, LEN(@sort) - 2)

    -- Return the result of the function
    RETURN @sort

END

Это конвертирует эти результаты:

1
1-10
1-3
2

в это:

01
01-03
01-10
02

Я проверил это с помощью следующего кода:

DECLARE  @something varchar(255)
set @something = '1-10-3-21'

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