PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ERREUR PostgreSQL :la fonction to_tsvector (caractère variable, inconnu) n'existe pas

Utilisez un cast de type explicite :

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

Ou changez la colonne languages.language pour taper regconfig . Voir la réponse de @Swav.

Pourquoi ?

Postgres permet la surcharge de fonctions. Les signatures de fonction sont définies par leur (éventuellement schéma -qualifié) nom plus (la liste des) type de paramètre d'entrée (s). La forme à 2 paramètres de to_tsvector() attend le type regconfig comme premier paramètre :

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

Si aucune fonction existante ne correspond exactement , les règles de résolution de type de fonction décident de la meilleure correspondance, le cas échéant. C'est réussi pour to_tsvector('english', 'hello world') , avec 'english' étant un littéral de chaîne non typé . Mais échoue avec un paramètre tapé varchar , car il n'y a pas d'enregistrement implicite cast depuis varchar à regconfig . Le manuel :

Ignorer les fonctions candidates pour lesquelles les types d'entrée ne correspondent pas et ne peuvent pas être converties (en utilisant une méthode implicite conversion) pour correspondre. littéraux inconnus sont supposés être convertibles en quoi que ce soit à cette fin.

Gras gras de la mienne.
Les casts enregistrés pour 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

Explication pour castcontext :

castcontext char
Indique dans quels contextes le cast peut être invoqué. e signifie uniquement en tant que cast explicite (en utilisant CAST ou :: syntaxe). a signifie implicitement dans l'affectation à une colonne cible, ainsi qu'explicitement. i signifie implicitement dans les expressions, ainsi que les autres cas.

En savoir plus sur les trois différents types de devoirs dans le chapitre CREATE CAST.