sql >> Base de Datos >  >> RDS >> PostgreSQL

ERROR de PostgreSQL:la función to_tsvector (carácter variable, desconocido) no existe

Utilice una conversión de tipos explícita:

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

O cambie la columna languages.language para escribir regconfig . Ver la respuesta de @Swav.

¿Por qué?

Postgres permite la sobrecarga de funciones. Las firmas de función se definen por su (opcionalmente esquema -calificado) nombre más (la lista de) tipo de parámetro de entrada (s). La forma de 2 parámetros de to_tsvector() espera tipo regconfig como primer parámetro:

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 ninguna función existente coincide exactamente , las reglas de resolución de tipo de función deciden cuál es la mejor coincidencia, si la hay. Esto es exitoso para to_tsvector('english', 'hello world') , con 'english' siendo un literal de cadena sin tipo . Pero falla con un parámetro escrito varchar , porque no hay ningún implícito registrado emitir desde varchar a regconfig . El manual:

Descartar funciones candidatas para las cuales los tipos de entrada no coinciden y no se pueden convertir (usando un implícito conversión) para que coincida. literales desconocidos se supone que son convertibles a cualquier cosa para este propósito.

Énfasis en negrita mío.
Las conversiones registradas para 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

Explicación para castcontext :

castcontext char
Indica en qué contextos se puede invocar el elenco. e significa solo como un lanzamiento explícito (usando CAST o :: sintaxis). a significa implícitamente en la asignación a una columna de destino, así como explícitamente. i significa implícitamente en expresiones, así como los demás casos.

Más información sobre los tres tipos de tareas diferentes en el capítulo CREAR REPARTO.