PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erstellen Sie einen unveränderlichen Klon von concat_ws

Zuerst , benötigt die Funktion zwei Parameter in der Definition, wie Richard bereits vorgeschlagen hat, und Sie haben Ihre Frage entsprechend aktualisiert.

Zweiter , können Sie diese Funktion mit "any" erstellen Eingabe über LANGUAGE internal . Bedeutet jedoch nicht, dass Sie dies tun sollten.

concat_ws() ist nur STABLE aus einem Grund. Unter anderem die Textdarstellung von date oder timestamp hängt von Gebietsschema-/Datumsstil-Einstellungen ab, daher ist das Ergebnis nicht unveränderlich . Darauf aufbauende Indizes könnten stillschweigend brechen. Beschränkt auf text Eingabe, es ist sicher, sie als IMMUTABLE zu deklarieren .Da braucht man nur text input (oder varchar , die eine implizite Umwandlung in text hat ), beschränken Sie es auf Ihren Anwendungsfall und seien Sie sicher:

CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE PARALLEL SAFE;

Markieren Sie es als PARALLEL SAFE um die Parallelität nicht zu beeinträchtigen, wenn diese Funktion einbezogen wird. Das Handbuch:

Widerstehen Sie der Versuchung, solche Dinge zu tun immutable_concat_ws('|', now()::text, 'foo') . Dies würde besagte Abhängigkeiten wieder in den Aufruf einführen.

Verwandte: