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: