Как отсортировать алфавитно-цифровые значения?

Вопрос или проблема

У меня есть таблица и некоторые примерные данные:

CREATE TABLE alphanumeric
(
       alphanum varchar
);

INSERT INTO alphanumeric VALUES
('1'),
('A1'),
('A2'),
('A11'),
('2'),
('AB1'),
('AB2'),
('AB11'),
('11'),
('C3'),
('C4'),
('C33'),
('111');

Теперь я хочу отсортировать алфавитно-цифровым образом как:

1
2
11
111
A1
A2
A11
AB1
AB2
AB11
C3
C4
C33

Но когда я попробовал:

SELECT alphanum
FROM alphanumeric
ORDER BY alphanum;

Это не тот результат, который я ожидал:

1
11
111 
2 <-
A1
A11 <-
A2
AB1
AB11 <-
AB2
C3
C33 <-
C4

Что мне делать? Я был бы очень признателен, если бы кто-то мог помочь. (Кстати, база данных, которую я использую, поддерживает большинство синтаксиса PostgreSQL, так что вы можете использовать PostgreSQL для демонстрации)

Мы можем использовать регулярные выражения, чтобы сначала отсортировать по начальным буквам, а затем по конечным цифрам:

SELECT alphanum
FROM alphanumeric
ORDER BY
    SUBSTRING(alphanum FROM '^[A-Z]+'),
    SUBSTRING(alphanum FROM '[0-9]+$')::int;

Ответ или решение

Чтобы сортировать алфавитно-цифровые значения в базе данных, необходимо учитывать порядок, в котором буквы и числа должны быть упорядочены. Давайте разберем, как это сделать, используя ваш пример данных.

Проблема

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

Ожидаемый результат сортировки

Ваши данные должны быть отсортированы следующим образом:

1
2
11
111
A1
A2
A11
AB1
AB2
AB11
C3
C4
C33

Решение

Для правильной сортировки вам необходимо использовать регулярные выражения, чтобы разделить строку на буквенную и числовую части. Затем следует выполнить сортировку по первой части (буквы), а затем по второй части (числа). В PostgreSQL это можно сделать с помощью функции SUBSTRING и оператора ORDER BY.

Код SQL

Вот пример SQL-запроса, который выполнит вашу задачу:

SELECT alphanum
FROM alphanumeric
ORDER BY
    SUBSTRING(alphanum FROM '^[A-Z]+'),  -- Буквы в начале строки
    SUBSTRING(alphanum FROM '[0-9]+$')::int; -- Числа в конце строки

Объяснение запроса

  1. SUBSTRING(alphanum FROM ‘^[A-Z]+’): Эта часть извлекает буквы, которые находятся в начале строки. Она будет использоваться для первой стадии сортировки.
  2. SUBSTRING(alphanum FROM ‘[0-9]+$’)::int: Эта часть извлекает числа из конца строки и преобразует их в целочисленный формат для правильного сравнения во второй стадии сортировки.
  3. ORDER BY: Данный оператор использует сначала текстовую часть (буквы), а затем числовую часть (числа) для сортировки.

Заключение

С помощью приведенного SQL-запроса вы сможете получить желаемый порядок сортировки ваших алфавитно-цифровых значений. Убедитесь, что ваш SQL-сервер поддерживает синтаксис PostgreSQL, чтобы указанные функции работали корректно. После выполнения этого запроса вы получите отсортированные данные в нужном вам порядке.

Оцените материал
Добавить комментарий

Капча загружается...