Как отсортировать буквенно-цифровую строку в SQL Server - PullRequest
1 голос
/ 04 августа 2011

Я хочу отсортировать буквенно-цифровую строку ...

образец строки:

D12,D13
F19,F20
A12,A13
F10,F11
D14
A1,A2
A5,A6
D4,D5
F5,F6,F7

Желаемый вывод:

A1,A2
A5,A6
A12,A13
D4,D5
D12,D13
D14
F5,F6,F7
F10,F11
F19,F20

ПОМОГИ МНЕ !!!!

Ответы [ 3 ]

1 голос
/ 05 августа 2011

Основываясь на новых требованиях и в общих чертах на ответе @kuru kuru, я надеюсь, что этот порядок по пунктам демонстрирует, почему нормализация - это хорошо. То, что это хорошо для JSON и Ajax, не означает, что вы должны обращаться с вашей базой данных:

DECLARE @t TABLE (x VARCHAR(32));

INSERT @t VALUES
  ('D12,D13'),
  ('F19,F20'),
  ('A12,A13'),
  ('F10,F11'),
  ('D14'),
  ('A1,A2'),
  ('A5,A6'),
  ('D4,D5'),
  ('F5,F6,F7'),
  ('AA1,AA2'),
  ('Z98,Z99');

SELECT x FROM @t
ORDER BY CASE 
    WHEN UPPER(x) LIKE '[A-Z][A-Z]%'
    THEN 'Z' + LEFT(x,2) ELSE LEFT(x,1) END,
    CONVERT(INT, 
      CASE WHEN x LIKE '%,%' THEN 
        SUBSTRING(x, PATINDEX('%[0-9]%', x), 
        CHARINDEX(',', x)-PATINDEX('%[0-9]%', x))
      ELSE 
        SUBSTRING(x, PATINDEX('%[0-9]%', x), 32)
      END
    );
1 голос
/ 04 августа 2011

Как отметили @JNK и @Aaron Bertrand, T-SQL на самом деле не лучший выбор для этой задачи.

Сказав это, нужно решить пару вопросов.

  1. Вам придется разделить каждый элемент на два компонента, альфа-часть и числовую часть, в противном случае "A5, ..." не будет отсортирован до "A12 ,. .. ", так как" A5 "идет после" A1 "при сравнении строковых значений. Чтобы получить правильный порядок сортировки, вам придется проанализировать значения и превратить «A5» в «A05» (или сколько угодно значащих цифр).

  2. Игнорируете ли вы дополнительный элемент (ы) после запятой в каждой строке? Если ответ отрицательный, вам придется выполнить обработку, описанную в # 1, для каждого значения в строке. Например, возможно ли иметь «A5, A6» и вы хотите, чтобы это значение было отсортировано до «A5, A12»?

Как только вы нормализуете значения в строках, вы можете заняться сравнением и сортировкой.

0 голосов
/ 05 августа 2011

Я не могу поверить, что все говорят так много о TSQL.:-)

Вам не нужно нормализовать данные перед их сортировкой.(Ну, явно не в любом случае - движок SQL может просто надеть защитные очки при обработке предложения ORDER BY, и он будет работать нормально).

Вот пример, который работает в TSQL ..Я знаю, что выглядит как нет никакой причины, чтобы правая сторона правильно заказывала, но на самом деле это правильно.

declare @table TABLE (item varchar(10))
insert into @table(item) values('FF5')
insert into @table(item) values('Z10')
insert into @table(item) values('F15')
insert into @table(item) values('F20')
insert into @table(item) values('A7')
insert into @table(item) values('A12')

SELECT
    item
FROM
    @table
ORDER BY
    CASE WHEN SUBSTRING(item,2,1) LIKE '[A-Z]' THEN LEFT(item,2) ELSE LEFT(item,1) END
...