Как отсортировать столбец VARCHAR в PostgreSQL, содержащий слова и цифры? - PullRequest
6 голосов
/ 02 ноября 2010

Мне нужно заказать запрос на выборку, используя столбец varchar, используя числовой и текстовый порядок.Запрос будет выполнен в Java-программе, используя jdbc вместо postgresql.

Если я использую ORDER BY в предложении select, я получу:

1
11
2
abc

Однако мне нужно получить:

1
2
11
abc

Проблема в том, что столбец также может содержать текст.

Этот вопрос похож (но предназначен для SQL Server):

Как мнесортировать столбец VARCHAR на сервере SQL, содержащий слова и цифры?

Однако предлагаемое решение не работает с PostgreSQL.

Заранее спасибо, с уважением,

Ответы [ 3 ]

6 голосов
/ 03 ноября 2010

У меня была такая же проблема, и следующий код решает ее:

SELECT ...
  FROM table
  order by  
    CASE WHEN column < 'A' 
        THEN lpad(column, size, '0')
    ELSE column 
        END;

Размер var - это длина столбца varchar, например, 255 для переменной (255).

5 голосов
/ 03 ноября 2010

Вы можете использовать регулярные выражения, чтобы делать такие вещи:

select THECOL from ...
order by
  case
    when substring(THECOL from '^\d+$') is null then 9999
    else cast(THECOL as integer)
  end,
  THECOL

Сначала вы используете регулярное выражение, чтобы определить, является ли содержимое столбца числом или нет. В этом случае я использую '^ \ d + $', но вы можете изменить его в соответствии с ситуацией.

Если регулярное выражение не совпадает, вернуть большое число, чтобы этот ряд упал до дна ордера.

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

После этого регулярно сортируйте по столбцу.

1 голос
/ 02 ноября 2010

Я не знаю ни о какой базе данных, имеющей «естественную сортировку», как некоторые знают, что она существует в PHP. Все, что я нашел, это различные функции:

...