2013-06-07 3 views
1

В базах данных, если у меня есть текстовое поле с числами как часть данных, и я пытаюсь сортировать, цифры не возвращаются последовательно, псевдо "в алфавитном порядке.сортировка текстовых данных (например, числа), поэтому числовое значение следует соблюдать

Я ожидаю такого поведения, и мне это удобно. Однако пользователь запросил, если возможно, отсортировать по порядку и по алфавиту.

Пример DATA (отсортированный):

100 
1001 
1110 
1010101E 
2 
200 
22ER 
Abd 
Bre 

Если клиент - хочет "2" для сортировки ДО "100" и "200" для сортировки, прежде чем "1001" , где это становится липким то, где появляются числовые/буквенные комбо. Эти проблемы объясняются тем фактом, что имена элементов можно назвать чем угодно («Box-one», «Box 1», «Box1», «1Box» «1» и т. Д.), Например, упорядочивание по «firstname», но многие люди называют своего ребенка цифрой - сортировка - это кошмар.

Я играл с идеей делать СОЮЗ всех «числовых» полей, отбрасывать их число и сортировать, а затем объединять с альфа-числами ... Таким образом, по крайней мере, цифры были «как ожидаемый ", - но накладные расходы кажутся возмутительными.

После запроса пользователя я бы ожидать, что «2erd» разбирайтесь перед «100» и «22Asd» отсортирует перед «22asd»

Любые предложения или решения? Это должно произойти. Мы используем V9.5 DB2

ведущие нули также "вопрос" как "0000123" сортов, прежде чем "122"

+0

Какую вы используете? –

+0

и на какой платформе? z/OS, я полагаю? – mustaccio

+0

linux (suse & slackware) – jpmyob

ответ

0

Если вы используете MySQL, вы можете сделать:

order by field+0, field 

MySQL автоматически выполняет преобразование самых левых символов в строке для арифметической операции.

В других базах данных это кажется более сложным. В некоторых случаях вы можете использовать REGEXP для замены шаблона (например, удаление всех символов после первой нецифровой). Или, возможно, придется проходным самих персонажей, с чем-то вроде:

order by (case when left(field, 5) not like '[^0-9]' then cast(left(field, 5) as int) 
       when left(field, 4) not like '[^0-9]' then cast(left(field, 4) as int) 
       when left(field, 3) not like '[^0-9]' then cast(left(field, 3) as int) 
       when left(field, 2) not like '[^0-9]' then cast(left(field, 2) as int) 
       when left(field, 1) not like '[^0-9]' then cast(left(field, 1) as int) 
      end), field 
+0

Мы используем DB2 ... – jpmyob

1

не имеют 9,5 экземпляр удобно, но это должно работать, как он использует только функциональные возможности, доступные в DB2 9.5:

db2 => with input (f) as ( 
    values ('100'), ('1001'), ('1110'), ('1010101E'), 
    ('2'), ('200'), ('22ER'), ('Abd'), ('Bre') 
) 
    select * from input 
    order by case 
    when 
     length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
     then 9999999999999 -- alpha only; make sure it sorts after all numbers 
    else 
     integer(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) -- convert to integer 
    end, -- this column is numeric 
    case 
    when 
     length(trim(translate(f,'','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'))) = 0 
     then f -- alpha only 
    else '' -- nothing; sorts before other strings 
    end 
    ; 

    F  
    -------- 
    2  
    22ER  
    100  
    200  
    1001  
    1110  
    1010101E 
    Abd  
    Bre  

    9 record(s) selected. 

Функция TRANSLATE используется для удаления нечисловых символов из значений столбцов, что позволяет сортировать оставшиеся данные численно.

+0

Я попробую и дам вам знать - спасибо – jpmyob

+0

Это выглядит многообещающим, но я получаю SQL Error [22018]: Недопустимый символ, найденный в аргументе символьной строки функции «INTEGER», .. SQLCODE = -420, SQLSTATE = 22018, DRIVER = 3.59.81 Недопустимый символ, найденный в аргументе символьной строки функции «INTEGER» .. SQLCODE = -420, SQLSTATE = 22018, DRIVER = 3.59.81 – jpmyob

+0

Проблема происходит там, где в строке есть не буквенно-цифровая строка, такая как «10% 01» ... скорее всего, символ подчеркивания или тире в нашем наборе данных – jpmyob

0

Другой подход заключается в том, чтобы обрезать и правильно оправдать ваши строки. Скажем, ваша колонка шириной 20 символов. Вы можете использовать что-то вроде

right(repeat(' ',20)||trim(yourdata),20) 

Конечно, это не работает так хорошо, если строка начинается с нечисловыми символами.

0

Можете ли вы сделать что-то вроде (предполагается, что sortfield меньше 11 символов, если он больше вам нужно будет увеличить число нулей и точки усечения или положить в тесте):

Сортировать по праву (concat ("0000000000", sortField), 10)

Смежные вопросы