Um nicht das gesamte Problem zu lesen, lautet meine grundlegende Frage:
Gibt es eine Funktion in PostgreSQL, um Zeichen eines regulären Ausdrucks in einer Zeichenkette zu entschlüsseln?
Ich habe in der Dokumentation nachgesehen, konnte aber keine solche Funktion finden.
Hier ist das ganze Problem:
In einer PostgreSQL-Datenbank habe ich eine Spalte mit eindeutigen Namen darin. Ich habe auch einen Prozess, der in regelmäßigen Abständen Namen in dieses Feld einfügt. Wenn er einen Namen eingeben muss, der bereits existiert, fügt er ein Leerzeichen und Klammern mit einer Zählung an das Ende an, um Duplikate zu vermeiden.
d.h. Name, Name (1), Name (2), Name (3), usw.
So wie es aussieht, verwende ich den folgenden Code, um die nächste Zahl zu finden, die in der Reihe hinzugefügt werden soll (geschrieben in plpgsql):
var_name_id := 1;
SELECT CAST(substring(a.name from E'\\((\\d+)\\)$') AS int)
INTO var_last_name_id
FROM my_table.names a
WHERE a.name LIKE var_name || ' (%)'
ORDER BY CAST(substring(a.name from E'\\((\\d+)\\)$') AS int) DESC
LIMIT 1;
IF var_last_name_id IS NOT NULL THEN
var_name_id = var_last_name_id + 1;
END IF;
var_new_name := var_name || ' (' || var_name_id || ')';
( var_name
enthält den Namen, den ich einzufügen versuche).
Das funktioniert im Moment, aber das Problem liegt in der WHERE
Erklärung:
WHERE a.name LIKE var_name || ' (%)'
Bei dieser Prüfung wird nicht überprüft, ob die %
in Frage ist eine Zahl, und es berücksichtigt nicht für mehrere Klammern, wie in etwas wie "Name ((1))", und wenn einer der beiden Fälle existierte, würde eine Cast-Ausnahme ausgelöst werden.
Le site WHERE
Die Aussage müsste eigentlich eher so lauten:
WHERE a.r1_name ~* var_name || E' \\(\\d+\\)'
Aber var_name
könnte Zeichen eines regulären Ausdrucks enthalten, was zu der obigen Frage führt: Gibt es in PostgreSQL eine Funktion, die Zeichen für reguläre Ausdrücke in einer Zeichenkette umgeht, so dass ich etwas wie folgt tun könnte:
WHERE a.r1_name ~* regex_escape(var_name) || E' \\(\\d+\\)'
Ich bin für jeden Vorschlag dankbar, auch für eine mögliche Überarbeitung meiner Lösung für doppelte Namen.