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

PostgreSQL-FEHLER:Funktion to_tsvector (Zeichen variiert, unbekannt) existiert nicht

Verwenden Sie eine explizite Typumwandlung:

SELECT language, to_tsvector(language::regconfig, 'hello world') FROM languages;

Oder ändern Sie die Spalte languages.language um regconfig einzugeben . Siehe Antwort von @Swav.

Warum?

Postgres erlaubt das Überladen von Funktionen. Funktionssignaturen werden durch ihr (optionales Schema) definiert -qualifiziert) Name plus (die Liste von) Eingabeparametertyp (s). Die 2-Parameter-Form von to_tsvector() erwartet den Typ regconfig als erster Parameter:

SELECT proname, pg_get_function_arguments(oid)
FROM   pg_catalog.pg_proc
WHERE  proname = 'to_tsvector'

   proname   | pg_get_function_arguments
-------------+---------------------------
 to_tsvector | text
 to_tsvector | regconfig, text             -- you are here

Wenn keine vorhandene Funktion genau übereinstimmt , entscheiden die Regeln der Funktionstypauflösung über die beste Übereinstimmung – falls vorhanden. Dies ist erfolgreich für to_tsvector('english', 'hello world') , mit 'english' ein nicht typisiertes Zeichenfolgenliteral sein . Aber schlägt mit einem typisierten varchar Parameter fehl , weil es kein registriertes implizites gibt Umwandlung von varchar zu regconfig . Das Handbuch:

Verwerfen Sie Kandidatenfunktionen, für die die Eingabetypen nicht übereinstimmen und nicht konvertiert werden können (unter Verwendung eines impliziten Konvertierung) passend. unbekannte Literale davon ausgegangen, dass sie für diesen Zweck in alles umwandelbar sind.

Fettdruck von mir.
Die registrierten Casts für regconfig :

SELECT castsource::regtype, casttarget::regtype, castcontext
FROM   pg_catalog.pg_cast
WHERE  casttarget = 'regconfig'::regtype;

 castsource | casttarget | castcontext
------------+------------+-------------
 oid        | regconfig  | i
 bigint     | regconfig  | i
 smallint   | regconfig  | i
 integer    | regconfig  | i

Erklärung für castcontext :

castcontext char
Gibt an, in welchen Kontexten die Umwandlung aufgerufen werden kann. e bedeutet nur als explizite Umwandlung (mithilfe von CAST oder :: Syntax). a bedeutet sowohl implizit bei der Zuweisung zu einer Zielspalte als auch explizit. i bedeutet implizit in Ausdrücken, sowie die anderen Fälle.

Lesen Sie mehr über die drei verschiedenen Auftragsarten im Kapitel DARSTELLUNG ERSTELLEN.