SQL-запрос для сортировки данных при вставке, сначала цифры, затем алфавиты и последние символы

#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
  

демонстрация на dbfiddle.uk

Комментарии:

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)