2015-09-06 2 views
1

То, что я представляет собой сочетание цифр и колеблется в колонке, как такPostgreSql - Заказав сочетание числовых строк и диапазонов номеров

Range 
--------- 
1 
3-4 
4 
5-10 
8-9 
12-20 
2 
7 
9 
11-14 
6 
10 

То, что я хочу это их можно заказать в следующим образом

Range 
--------- 
1 
2 
3-4 
4 
5-10 
6 
7 
8-9 
9 
10 
11-14 
12-20 

не будет работать - простой ORDER BY "Range" производит следующее (как и ожидалось)

Range 
--------- 
1 
10 
11-14 
12-20 
2 
3-4 
4 
5-10 
6 
7 
8-9 
9 

Есть ли «простой» способ заставить меня упорядочить значения (диапазоны и числа), как я их хочу?

ответ

0

Вы можете использовать такой запрос:

SELECT * 
FROM YourTableName 
ORDER BY 
    CAST(
     CASE WHEN position('-' in Range) > 0 
     THEN substr(range, 0, position('-' in Range)) 
     ELSE Range 
     END 
    as integer) 

В вашем ORDER BY заявлении вы сначала извлечь номер из диапазона:

  • Если условие position('-' in Range) > 0 удовлетворяется, это означает, что у вас есть «- 'где-то в вашей строке, поэтому вы должны взять число до' - ', которое достигается с помощью substr(range, 0, position('-' in Range)). Например. если у вас есть 10-14 в вашей колонке, этот шаг занимает только 10.
  • Если предыдущее условие не выполнено, вы принимаете Range.

После выполнения вышеуказанных проверок вы получите номер. В этом случае вы присваиваете это значение целому числу, поэтому оно правильно упорядочивает номер (т. Е. Так 10 приходит после 2 и т. Д.)

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

+0

Указав это позже, но что, если у меня есть другие строковые значения в столбце, такие как 'Test String' и т. Д., Тогда это не сработает, не так ли? –

+0

Нет, это не сработает. Я обновил ответ, чтобы сказать, что – dotnetom

+0

Хорошо, но как насчет того, если я хочу, чтобы он работал и для этого случая :) –

0

Учитывая ваш актуальный вопрос, это легче всего сделать с помощью split_part():

order by cast(split_part(range, '-', 1) as int) 

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

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