Postgres регулярные выражения и regexp_split_to_array - PullRequest
7 голосов
/ 21 марта 2011

В postgresql мне нужно извлечь первые два слова в значении для данного столбца. Поэтому, если значение равно «Привет, мир луны и звезд» или «Привет, мир луны» или даже просто «Привет, мир», мне нужен «Привет, мир».

Я надеялся использовать regexp_split_to_array, но не похоже, что я могу использовать это и получить доступ к элементам, возвращенным в том же запросе?

Нужно ли создавать функцию для того, что я пытаюсь сделать?

Ответы [ 4 ]

10 голосов
/ 21 декабря 2016

Я не могу поверить, что 5 лет назад, и никто не заметил, что вы можете получить доступ к элементам из функции regexp_split_to_array , если окружить их скобками.

Я видел, как многие люди пытались получить доступ к элементам таблицы следующим образом:

select regexp_split_to_array(my_field, E'my_pattern')[1] from my_table

Предыдущий вернет ошибку, но следующий не будет:

select (regexp_split_to_array(my_field, E'my_pattern'))[1] from my_table
8 голосов
/ 21 марта 2011

Вы можете использовать регулярные выражения POSIX с substring():

select substring('hello world moon' from E'^\\w+\\s+\\w+');

в PostgreSQL или с очень либеральной интерпретацией слова:

select substring('it''s a nice day' from E'^\\S+\\s+\\S+');

Обратите внимание на \S (без пробелов) вместо \w (символ "слово", буквально-цифровой плюс подчеркивание).

Не забывайте все лишние бессмысленные цитаты, хотя:

  • E'', чтобы сообщить PostgreSQL, что вы используете , расширяющий экранирование .
  • И затем двойные обратные косые черты для получения одиночных обратных косых черт после парсера строк и в парсере регулярных выражений.

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

select (regexp_split_to_array('hello world moon', E'\\s+'))[1:2];

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

2 голосов
/ 21 марта 2011

найден один ответ:

select split_part('hello world moon', ' ', 1) || ' ' || split_part('hello world moon', ' ', 2);
1 голос
/ 21 марта 2011
select substring(my_text from $$^\S+\s+\S+$$) from v;

  substring
-------------
 hello world
 hello world
 hello world
(3 rows)

, где с целью демонстрации, v равно:

create view v as select 'hello world moon and stars' as my_text union all 
                 select 'hello world mood' union all 
                 select 'hello world';

, если вы хотите игнорировать пробелы в начале:

select substring(my_text from $$^\s*\S+\s+\S+$$) from v;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...