2016-05-23 3 views
1

Я новичок в запросах Postgres. Я пытаюсь вытащить подстроку из каждой записи столбца на основе определенного набора. Предположим, я подстрока из каждой записи между началом «ключевых слов» & «конец». Таким образом, это может быть несколько случаев «start» & «конец» в одной записи и необходимо извлечь, что происходит между каждым набором «стартовых» & «конечных» ключевых слов.Вычитайте несколько строк из одной записи

enter image description here

У нас есть возможность достичь этого с одного запроса в Postgres, а не создание процедуры? Если да, не могли бы вы помочь в этом или перенаправить меня, где я могу найти соответствующую информацию?

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on- so-when-ask-a-question/285557 # 285557 –

ответ

0

Предполагая, что / всегда ограничивает элементы, вы можете использовать string_to_array() для преобразования строки в несколько элементов и unnest(), чтобы превратить массив в результат. Затем вы можете использовать regexp_replace(), чтобы избавиться от разделителей в фигурных скобках:

select d.id, regexp_replace(t.name, '{start}|{end}', '', 'g') 
from the_able d 
    cross join unnest(string_to_array(d.body,'/')) as t(name); 

SQLFiddle пример: http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8863

+0

Это просто пример данных. Данные не в том же формате, как указано выше. Может иметь некоторые другие данные между {end}/{start}. Основное намерение состоит в том, чтобы извлечь данные между определенными ключевыми словами. – Keen2Learn

+0

@ Keen2Learn: тогда, пожалуйста, напишите ** настоящие ** данные. Если вы публикуете дату, вы получите неправильные ответы –

0

Вы достигаете все это с помощью регулярных выражений, и PostgreSQL регулярных выражений функции regexp_matches (для соответствия содержимого между ваши метки) и REGEXP_REPLACE (удалить теги):

with t(id,body) as (values 
        (1, '{start}John{end}/{start}Jack{end}'), 
        (2, '{start}David{end}'), 
        (3, '{start}Ken{end}/{start}Kane{end}/{start}John{end}')) 
select id, regexp_replace(
      (regexp_matches(body, '{start}.*?{end}', 'g'))[1], 
      '^{start}|{end}$', '', 'g') matches 
from t 

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

  • Нет связанных вопросов^_^