#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня возникают проблемы с написанием запроса сортировки SQL, у меня есть таблица следующего вида
И я хочу отсортировать вышеуказанные данные так, сначала следует номер, а затем алфавиты и последние специальные символы, как в следующей таблице.
Первые числа должны быть отсортированы как 1,2,3,11,22,33, затем алфавиты должны быть отсортированы как a, b, c, .. z, а затем символы, как в следующей таблице
Я перепробовал много способов, но все еще не получается правильно, пожалуйста, помогите мне написать запрос.
Ответ №1:
Вы можете использовать CASE WHEN
на ORDER BY
для создания некоторых групп:
SELECT *
FROM table_name
ORDER BY
CASE WHEN LEFT(FilterParameterValue, 1) LIKE '[0-9]' OR LEFT(FilterParameterValue, 2) LIKE '-[0-9]' OR LEFT(FilterParameterValue, 2) LIKE ' [0-9]' THEN 1 ELSE 0 END DESC, -- group for numbers
CASE WHEN ISNUMERIC(FilterParameterValue) = 1 THEN CAST(FilterParameterValue AS MONEY) ELSE NULL END ASC, -- order the numeric values
CASE WHEN LEFT(FilterParameterValue, 1) LIKE '[A-Za-z]' THEN 1 ELSE 0 END DESC, -- group for chars from A to Z (capital / non capital)
colName
Комментарии:
1. ожидаемый результат становится неправильным, он не сортирует числа, такие как 1 2,11, 22, ваш запрос показывает результат как 1,11,2,22
2. это работает нормально, как и ожидалось, но при получении исключения для специального символа ошибка — Ошибка преобразования при преобразовании значения nvarchar ‘$’ в тип данных int.
3. при использовании ‘$’ возникает исключение
4. Уже обновлено использование
MONEY
вместоINT
, чтобы вы также могли сортировать десятичные числа (см. Демонстрацию)
Ответ №2:
Попробуйте использовать регулярное выражение в предложении order by.. Например
ПОРЯДОК ПО IF(FilterParameterValue RLIKE ‘^[a-z]’, 1, 2), FilterParameterValue
Ответ №3:
Вы можете попробовать привести свой столбец к числовому типу, а затем упорядочить
SELECT * FROM table_name ORDER BY TRY_CAST(Column_Name as Type)