PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ERRORE PostgreSQL:la funzione to_tsvector (carattere variabile, sconosciuto) non esiste

Usa un cast di tipo esplicito:

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

Oppure cambia la colonna languages.language per digitare regconfig . Vedi la risposta di @Swav.

Perché?

Postgres consente il sovraccarico delle funzioni. Le firme delle funzioni sono definite dal loro (facoltativamente schema -qualificato) nome più (l'elenco di) tipo di parametro di input (S). La forma a 2 parametri di to_tsvector() si aspetta il tipo regconfig come primo parametro:

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

Se nessuna funzione esistente corrisponde esattamente , le regole di Function Type Resolution decidono la migliore corrispondenza, se presente. Questo ha successo per to_tsvector('english', 'hello world') , con 'english' essendo una stringa letterale non tipizzata . Ma non riesce con un parametro digitato varchar , perché non ci sono impliciti registrati trasmesso da varchar a regconfig . Il manuale:

Elimina le funzioni candidate per le quali i tipi di input non corrispondono e non possono essere convertite (usando un implicito conversione) da abbinare. letterali sconosciuti si presume siano convertibili in qualsiasi cosa per questo scopo.

Il grassetto è mio.
I cast registrati per 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

Spiegazione per castcontext :

castcontext char
Indica in quali contesti è possibile richiamare il cast. e significa solo come cast esplicito (usando CAST o :: sintassi). a significa implicitamente nell'assegnazione a una colonna di destinazione, così come esplicitamente. i significa implicitamente nelle espressioni, così come negli altri casi.

Ulteriori informazioni sui tre diversi tipi di assegnazione nel capitolo CREA CAST.