2017-02-17 3 views
0

Ich habe versucht, fehlerhafte Daten in Postgres DB zu korrigieren, wo Foto-Tags zweimal angehängt werden.Postgres: Entfernen des zweiten Vorkommens einer Zeichenkette

The trip is wonderful.<photo=2-1-1601981-7-1.jpg><photo=2-1-1601981-5-2.jpg>We enjoyed it very much.<photo=2-1-1601981-5-2.jpg><photo=2-1-1601981-7-1.jpg>

Wie Sie in der Zeichenfolge sehen können, Foto-Tags wurden bereits aufgenommen, aber sie waren auf den Text wieder angehängt. Ich möchte das zweite Vorkommen entfernen:. Das erste Vorkommen hat eine bestimmte Reihenfolge und ich möchte sie behalten.

Ich schrieb eine Funktion, die eine RegexMuster konstruieren könnte:

CREATE OR REPLACE FUNCTION dd_trip_photo_tags(tagId int) RETURNS text 
LANGUAGE sql IMMUTABLE 
AS $$ 
SELECT string_agg(concat('<photo=',media_name,'>.*?(<photo=',media_name,'>)'),'|') FROM t_ddtrip_media WHERE tag_id=tagId $$; 

Dies ist das zweite Auftreten eines bestimmten Foto-Tag erfasst. Dann verwende ich regex_replace, um das zweite Vorkommen zu ersetzen: update t_ddtrip_content setze content = regexp_replace (Inhalt, dd_trip_photo_tags (332761), '') von t_ddtrip_content wo tag_id = 332761;

Es würde jedoch alle übereinstimmenden Tags entfernen. Ich habe tagelang online nachgeschaut, konnte aber immer noch keine Lösung finden. Schätze jede Hilfe.

Antwort

0

Dies sollte funktionieren.

Regex 1:

<photo=.+?> 

Siehe: https://regex101.com/r/thHmlq/1

Regex 2:

<.+?> 

Siehe: https://regex101.com/r/thHmlq/2

Input:

The trip is wonderful.<photo=2-1-1601981-7-1.jpg><photo=2-1-1601981-5-2.jpg>We enjoyed it very much.<photo=2-1-1601981-5-2.jpg><photo=2-1-1601981-7-1.jpg> 

Ausgang:

<photo=2-1-1601981-7-1.jpg> 
<photo=2-1-1601981-5-2.jpg> 
<photo=2-1-1601981-5-2.jpg> 
<photo=2-1-1601981-7-1.jpg> 
Verwandte Themen