Как мне сделать заказ на поле varchar, которое может содержать цифры в алфавитном порядке? - PullRequest
3 голосов
/ 12 января 2010

Я уверен, что это должно быть довольно распространенной проблемой, поэтому я предполагаю, что Microsoft уже решила эту проблему. Мои навыки поиска в Google просто не на пустом месте. У меня есть поле, по которому я хочу заказать, это поле varchar, например

  • Q
  • Num 10
  • Num 1
  • A
  • Num 9
  • Num 2
  • F

Теперь я ожидаю, что результат будет

  • F
  • Num 1
  • Num 2
  • Num 9
  • Num 10
  • Q

Но это не так. Это происходит следующим образом (обратите внимание, что число 10 следует за номером 1, а не числом 9, как ожидалось)

  • A
  • F
  • Num 1
  • Num 10
  • Num 2
  • Num 9
  • Q

Теперь я знаю причину этого, поэтому вам не нужно объяснять :) Но я не могу вспомнить, как ее решить, или есть хороший флаг или команда, которую я могу использовать, чтобы сделать это правильно.

EDIT:

Приведенные выше примеры являются лишь примером. Столбец может содержать любое значение. Любая комбинация букв и цифр. Есть ли способ отсортировать это по-человечески в алфавитном порядке вместо значения ASCII в алфавитном порядке?

РЕДАКТИРОВАТЬ 2: Спасибо за ответы до сих пор. Я говорю о ЛЮБЫХ арбитражных данных. Если бы он был в фиксированном положении или ему предшествовало что-то, это было бы легко, и я бы не стал спрашивать. Я прошу общее решение этой проблемы с ЛЮБЫМИ произвольными данными. Ни шаблонов, ни правил, ни ничего.

Ответы [ 4 ]

1 голос
/ 13 января 2010

"Я прошу общее решение эта проблема с любыми произвольными данными. Ни шаблонов, ни правил, ни ничего. "

Проблема в том, что программирование - это поиск шаблонов, получение правил из шаблонов и применение решений на основе этих правил. Таким образом, без этих предварительных условий ваш вопрос довольно сложный.

По сути, вам нужно разбить строку сортировки на куски чистых букв и куски чистых цифр и применить разные порядки сортировки для каждой категории. Это выполнимо, если у вас есть какой-то шаблон, например

   AAA999AA
   A9AAAAA
   A999A

но это потребовало бы индивидуального решения для каждого шаблона. Общее решение для любого произвольного расположения данных является большой просьбой.

1 голос
/ 12 января 2010

Это извечная проблема порядка сортировки Ascii и порядка естественной сортировки

Подробнее см. Сортировка для людей: порядок сортировки естественного .

1 голос
/ 12 января 2010

Вы добавили

Столбец может содержать любое значение. Любая комбинация букв и цифр

Итак, где вы хотите "foo1bar" и "foo10bar", например? Или "foo10bar11" и "foo10bar1"? Или "Foo Two" и "Foo Three"?

Нет разумного решения без разумных данных. У вас есть случайные данные. Определите «читабельный».

1 голос
/ 12 января 2010

Если у поля всегда есть номер в конце с возможно одним словом перед ним и пробелом перед ним, вы можете использовать CHARINDEX / SUBSTRING для решения этого.

Вот пример:

select *
from (
    select 'Q' x
    union
    select 'Num 10'
    union
    select 'Num 1'
    union
    select 'A'
    union
    select 'Num 9'
    union
    select 'Num 2'
    union
    select 'F'
) a
order by
    case
        when CHARINDEX(' ', x) <> 0 then LEFT(x, CHARINDEX(' ', x) - 1)
        else x
    end,
    cast(case
        when CHARINDEX(' ', x) <> 0 then substring(x, CHARINDEX(' ', x) + 1, LEN(x) - CHARINDEX(' ', x) )
        else ''
    end as int)

Выходные данные:

A
F
Num 1
Num 2
Num 9
Num 10
Q

Edit:

Поскольку ваши данные недостаточно согласованы, чтобы использовать жестко закодированный подход, решение требует более решительных мер. Я экспериментировал с функциями на основе T-SQL, которые примут форму естественной сортировки, но обнаружил, что они слишком медленные, чтобы их можно было использовать. Вместо этого я написал функцию, основанную на CLR, и она работает очень хорошо. Функция возвращает скалярное значение, по которому вы можете сортировать. Вы найдете код и инструкции по установке на здесь .

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