Mehrere textteile aus String heraussuchen zum weiterbearbeiten

Hallo

Ich habe eine Tabelle mit viel Freitext, in der bestimmte Abkürzungen vorkommen.
z.b. … MBW OB 2020 11 xx …
Genau diese will ich jetzt herausfiltern und weiterbearbeiten.
MBW OB ist die Startkennnung, danach das Jahr, dann die Kalenderwoche und dann noch ein Namemskürzel, diese Textblöcke können auch mehrmals in einem Kommentar vorkommen mit unterschiedlichen Jahren und Wochen.

Ist es möglich (und wenn ja wie) diese herausfiltern und auf diese wie ein Ergebnis einer qry weiterzuverarbeiten ??
z.b. suche ich nach MBW OB - wenn das vorkommt, will ich 17 Zeichen ab dem M haben.

Hat hemand eine Idee ??

Danke, Roland

nachtrag:

mit
substring(kommentar from ‘%#"%MBW OB __________#"%’ for ‘#’)
bekomme ich jeweils den letzten eintrag, ich bräuchte aber alle.

Du kannst regexp_matches() verwenden. Das liefert mehrere Zeilen mit Arrays der passenden Strings.

select m.words[1]
from the_table
  cross join regexp_matches(kommentar , 'MBW OB [0-9]{4} [0-9]{2} .{10}', 'g') as m(words)

Jede Zeile enthält ein Array mit einem Element (da das Pattern so geschrieben ist, dass es nicht mehrere liefert). Das [1] nimmt dann den ersten Eintrag des Array.

Das folgende Beispiel:

with the_table (id, kommentar) as (
 values 
   (1, 'blabla MBW OB 2020 11 1234567890 bla MBW OB 2019 11 0987654321 blabla'),
   (2, 'blub MBW OB 2010 01 1234567890 bla MBW OB 2012 10 0987654321 blub')
)
select t.id, m.words[1]
from the_table t
  cross join regexp_matches(kommentar , 'MBW OB [0-9]{4} [0-9]{2} .{10}', 'g') as m(words)

Liefert

id | words                    
---+--------------------------
 1 | MBW OB 2020 11 1234567890
 1 | MBW OB 2019 11 0987654321
 2 | MBW OB 2010 01 1234567890
 2 | MBW OB 2012 10 0987654321
1 Like

besser wäre es natürlich, das gleich richtig zu speichern …

@castrop: super, Danke
funktioniert:

,array_to_string(regexp_matches(regexp_replace(kommentar,‘MBW OB [0-9]{4} KW KZ’,’’,‘g’),‘MBW OB [0-9]{4} [0-9]{2} …’,‘g’ ),’,’,’’) OB

und anschließend zum Datum umwandeln:
to_date(substr(ob,8,4) || ‘-’ || substr(ob,13,2) || ‘-1’,‘IYYY-IW-ID’)

habe regex bisher nicht so wirklich kapiert :slight_smile:

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt.