Как отсортировать результаты SQL Server на основе первого наименьшего по величине, числового, а затем альфа - PullRequest
0 голосов
/ 05 апреля 2019
SELECT CASE WHEN LTRIM(BINNUMBER)='999999' THEN 'NO BIN' ELSE BINNUMBER END AS BINNUMBER,
                                      --SELECT BINNUMBER,
                                      SUBCLASS,
                                      STYLE_DESCRIPTION,
                                      style_code,
                                      color_code,
                                      size_code,
                                      QUANTITY_SOLD,
                                      SOH,
                                      CURRENT_PRICE     
                                      FROM #Final_By_Selection_withMinBin
                                      --WHERE BINNUMBER NOT BETWEEN '1' AND '999999'  || NOT BETWEEN @intFrom_BinNo AND @intTo_BinNo
                                      WHERE MIN_BINNUMBER NOT BETWEEN @intFrom_BinNo AND @intTo_BinNo
                                      ORDER BY

                                     --LEFT(size_master_id,PATINDEX('%[0-9]%',size_master_id)-1), -- alphabetical sort
                                     --CONVERT(VARCHAR,SUBSTRING(size_master_id,PATINDEX('%[0-9]%',size_master_id),LEN(size_master_id))) -- numerical sort

                                        substring(size_master_id, 0,patindex('%[0-9]%',size_master_id))+right ('00000' + substring(size_master_id,
                                        patindex('%[0-9]%',size_master_id) , len(size_master_id)),5)
                                                                END

1 Ответ

0 голосов
/ 05 апреля 2019

Предполагая, что ваш столбец имеет формат 'NNNNAAA' (N-числовой, A-алфавит), вы можете использовать

ORDER BY 
CAST(CASE WHEN PATINDEX('%[a-zA-Z]%', description) > 0 THEN 0 ELSE -1 END AS INT),

CAST(CASE WHEN substring(description,PATINDEX('%[0-9]%', description),ISNULL( NULLIF( PATINDEX('%[a-zA-Z]%', description) - 1, -1 ),LEN(description) )) = '' THEN 2147483647
          ELSE substring(description,PATINDEX('%[0-9]%', description),ISNULL( NULLIF( PATINDEX('%[a-zA-Z]%', description) - 1, -1 ),LEN(description) )) 
          END AS INT),

substring(description,PATINDEX('%[a-zA-Z]%', description),LEN(description) - PATINDEX('%[a-zA-Z]%', description) + 1

Объяснить:

PATINDEX возвращает мне первый альфа-индекс / первый числовой индекс в этой строке. Итак, сначала я сортирую вывод по наличию числовой части или нет, а затем сортирую по альфа-части. Надеюсь, это поможет вам.

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