2016-05-23 5 views
1

Ich bin Anfänger zu Postgres-Abfragen. Ich versuche, Teilstring aus jedem Datensatz der Spalte basierend auf bestimmten Satz zu ziehen. Angenommen, ich Teilstring aus jedem Datensatz zwischen Stichwörtern 'Start' & 'Ende'. So ist die Sache, es kann mehrere Vorkommen von 'Start' & 'Ende' in einem Datensatz sein und müssen extrahieren, was zwischen jedem Satz von 'Start' & 'Ende' Schlüsselwörter auftritt.Subtrahieren mehrere Zeichenfolgen aus einem Datensatz

enter image description here

Haben wir die Möglichkeit diese mit einzelnen Abfrage in Postgres zu erreichen, anstatt ein Verfahren zu schaffen? Wenn ja, könnten Sie mir bitte dabei helfen oder mich anleiten, wo ich ähnliche Informationen finden kann?

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on- so-wenn-eine Frage zu stellen/285557 # 285557 –

Antwort

0

Unter der Annahme, dass / immer die Elemente abgrenzt, können Sie string_to_array() verwenden, um die Zeichenfolge in mehrere Elemente zu konvertieren und unnest(), um das Array in ein Ergebnis zu verwandeln. Sie können dann regexp_replace() loszuwerden, die Trennzeichen in den geschweiften Klammern zu bekommen verwenden:

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 Beispiel: http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8863

+0

Dies ist ju st Beispieldaten. Die Daten haben nicht das gleiche Format wie oben. Kann einige andere Daten zwischen {end}/{start} haben. Hauptziel ist es, Daten zwischen bestimmten Keywords zu extrahieren. – Keen2Learn

+0

@ Keen2Learn: dann posten Sie bitte die ** echten ** Daten. Wenn Sie das aktualisierte Datum veröffentlichen, erhalten Sie falsche Antworten –

0

Sie erreichen alle diese mit regulären Ausdrücken und das PostgreSQL Regex Funktionen regexp_matches (entspricht Inhalt zwischen Ihre Tags) und REGEXP_REPLACE (um die Tags zu entfernen):

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