Postgres: данные заказа по части строки - PullRequest
10 голосов
/ 24 января 2012

У меня есть имя столбца, которое представляет имя человека в следующем формате:

firstname [middlename] lastname [, Sr.|Jr.]

Например, например:

John Smith
John J. Smith
John J. Smith, Sr.

Как я могу заказать элементы по фамилии?

Ответы [ 3 ]

10 голосов
/ 25 января 2012

A правильная и более быстрая версия может выглядеть так:

SELECT *
FROM   tbl
ORDER  BY substring(name, '([^[:space:]]+)(?:,|$)')

Или:

ORDER  BY substring(name, E'([^\\s]+)(?:,|$)')

Или даже:

ORDER  BY substring(name, E'([^\\s]+)(,|$)')

Объяснять

[^[:space:]]+ .. первая (и самая длинная) строка, состоящая из одного или нескольких непробельных символов.
(,|$) .. оканчивается запятой или концом строки.

Последние два примера используют синтаксис escape-строки и сокращение класса \s вместо длинной формы [[:space:]] (которая теряет внешний уровень скобок внутри класса символов).

На самом деле нам не нужно использовать не захватывающие скобки (?:) после части, которую мы хотим извлечь, потому что ( цитирование руководства ):

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

Test

SELECT substring(name, '([^[:space:]]+)(?:,|$)')
FROM  (VALUES 
  ('John Smith')
 ,('John J. Smith')
 ,('John J. Smith, Sr.')
 ,('foo bar Smith, Jr.')
) x(name)
2 голосов
/ 24 января 2012
SELECT *
FROM t
ORDER BY substring(name, E'^.*\\s([^\\s]+)(?=,|$)') ASC

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

2 голосов
/ 24 января 2012

Вы должны использовать функциональный индекс для этой цели http://www.postgresql.org/docs/7.3/static/indexes-functional.html

В вашем случае как-то ....

CREATE INDEX test1_lastname_col1_idx ON test1 (split_part(col1, ' ', 3));
SELECT * FROM test1 ORDER BY split_part(col1, ' ', 3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...