2012-06-29 2 views
0

У меня есть поля в столбце, которые выглядят примерно так:Как заказать по столбцу, если столбец не одного типа?

2/8B, 3, 3/8B, 4/8B, 2, 6, 4/9, 9, 8/9, 8, 7, 1, 5/9, 10, 3/9, 2/9, 7/9, 6/8B, 6/9, 1/9, 5, 8B, 5/8B, 4 

мне нужно отсортировать этот список таким образом, как:

1, 1/9, 2, 2/8B, 2/9, 3, 3/8B, 3/9, 4, 4/8B, 4/9, 5, 5/8B, 5/9, 6, 6/8B, 6/9, 7, 7/9, 8, 8/9, 8B, 9, 10 

Как сделать заказ По создать этот вывод?

Для устранения путаницы (1/2) не является долей. «/» является просто разделителем.

+1

Было бы полезно, если бы вы предоставили более крупный пример сортировки – Jake1164

+0

Что вы подразумеваете под «когда столбец не одного типа»? Столбец может быть только одного типа. –

+0

Извините, вот более крупный образец «10», «4», «4/9», «5», «9», «5/9» – kyle

ответ

0

Я не понимаю; используя символы, которые вы предоставили, сортируются в запрошенном вами порядке. Дайте ему шанс:

SELECT Test 
FROM (
    SELECT '38a' AS Test 
    UNION 
    SELECT '1' 
    UNION 
    SELECT '1/2' 
    UNION 
    SELECT '12' 
) MyData 
ORDER BY Test ASC 

EDIT

Теперь, когда вы дали конкретные примеры, я вижу, это был 10 и 8B, которые бросали вещи. Попробуйте вместо этого:

SELECT YourCol 
FROM YourTable 
ORDER BY CAST(REPLACE(REPLACE(REPLACE(YourCol, 'B', '.99'), '/', '.'), 
    '.8.99', '.899') AS NUMERIC(18, 4)) 

Это будет заказать как:

1, 1/9, 2, 2/8B, 2/9, 3, 3/8B, 3/9, 4 , 4/8B, 4/9, 5, 5/8B, 5/9, 6, 6/8B, 6/9, 7, 7/9, 8, 8/9, 8B, 9, 10

Это некрасиво, но оно работает. Если у вас есть другие буквы, кроме B, сценарий нужно будет изменить, чтобы обработать это.

+0

Извините, используя образцы '10', '4', '4/9', '5', '9', '5/9. Результаты не в порядке. – kyle

+0

1, 1/9, 10, 2, 2/8B, 2/9, 3, 3/8B, 3/9, 4, 4/8B, 4/9, 5, 5/8B, 5/9, 6 , 6/8B, 6/9, 7, 7/9, 8, 8/9, 8B, 9 – kyle

+0

@Kyle - это тот порядок, в котором вы хотите его отсортировать? Измените свой вопрос с помощью лучших примеров и определенного порядка сортировки. – LittleBobbyTables

0

Я предполагаю, что столбец, сортирует по является символьным типом данных (так как некоторые из значений не являются цифровыми символами) - так просто ORDER BY будет работать

select '38a' as value 
union 
select '12' 
union 
select '1/2' 
union 
select '1' 
order by value 

Не это даст вам результат, который вы ищете?

0

Один трюк, который вы можете использовать, состоит в том, чтобы вытащить ведущее целое из вашей строки, отсортировать по целочисленному значению, а затем по строке.

Я не знаю ни одного «простого» способа сделать это в SQL Server (т. Е. Без создания функции).

Один из способов сделать это с помощью встроенных встроенных функций SQL Server - использовать функцию PATINDEX для поиска начальной позиции «цифр» и «цифр», а затем использовать эти значения для определения длины ведущего целое число. Используйте функции SUBSTRING и CONVERT для извлечения ведущего целочисленного значения.

Это не красиво:

ORDER BY 
    CASE WHEN PATINDEX('[0-9]%', t.str) = 1 
    THEN 
     CASE WHEN PATINDEX('%[^0-9]%', t.str) > 0 
     THEN CONVERT(INTEGER,SUBSTRING(t.str ,1,PATINDEX('%[^0-9]%', t.str)-1)) 
     ELSE CONVERT(INTEGER, t.str) 
     END 
    ELSE NULL 
    END 
, t.str 

ПРИМЕЧАНИЯ:

t.str является заполнителем для выражения, которое возвращает ваши строковые значения.

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

Кроме того, это не выдает исключение (т. Е. Вызывает сбой инструкции), когда встречаются «неожиданные» значения, например, пустая строка «или строки без ведущего целого числа.

Это относится только к строке «ведущее целое» строки. Все после этого сравнивается как строка. (Это означает, что, например, «6/10B» будет сортировать до «1/8B», потому что «/ 1» < '/ 8'.

Любые ведущие нули в главном целочисленном значении будут проигнорированы для сравнения целого числа и (это означает, что, например, «05/9» будет сортироваться до «5/8», потому что 5 = 5, но «0» < '5')

Любые значения строк, которые не имеют ведущей цифре присваивается целочисленное значение NULL для операции сортировки, поэтому они будут сортироваться в первую очередь.

1

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

Я не знаю, как вы не идете по этой дороге. Но защищайся и предупреждай и поднимите столько, сколько сможете.

+0

+1 Отличные баллы о «защите и предупреждении». Выбранный ответ имеет выражение SQL, которое генерирует исключение (FAIL) при возникновении неожиданного значения. Гораздо лучше защищать код, проверять, что данные соответствуют спецификации на входе, а не начать запрос, который необъяснимо начинает сбой в производстве в самое неподходящее время спустя. – spencer7593

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