Вопрос или проблема
У меня есть таблица и некоторые примерные данные:
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; -- Числа в конце строки
Объяснение запроса
- SUBSTRING(alphanum FROM ‘^[A-Z]+’): Эта часть извлекает буквы, которые находятся в начале строки. Она будет использоваться для первой стадии сортировки.
- SUBSTRING(alphanum FROM ‘[0-9]+$’)::int: Эта часть извлекает числа из конца строки и преобразует их в целочисленный формат для правильного сравнения во второй стадии сортировки.
- ORDER BY: Данный оператор использует сначала текстовую часть (буквы), а затем числовую часть (числа) для сортировки.
Заключение
С помощью приведенного SQL-запроса вы сможете получить желаемый порядок сортировки ваших алфавитно-цифровых значений. Убедитесь, что ваш SQL-сервер поддерживает синтаксис PostgreSQL, чтобы указанные функции работали корректно. После выполнения этого запроса вы получите отсортированные данные в нужном вам порядке.