PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ERRO do PostgreSQL:função to_tsvector(variável de caracteres, desconhecido) não existe


Use uma conversão de tipo explícito:
SELECT language, to_tsvector(language::regconfig, 'hello world') FROM languages;

Ou altere a coluna languages.language para digitar regconfig . Veja a resposta do @Swav.

Por quê?


O Postgres permite a sobrecarga de funções. As assinaturas de funções são definidas por seus (opcionalmente esquema -qualificado) nome mais (a lista de) tipo de parâmetro de entrada (s). A forma de 2 parâmetros de to_tsvector() espera o tipo regconfig como primeiro 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

Se nenhuma função existente corresponder exatamente , as regras de Function Type Resolution decidem a melhor correspondência - se houver. Isso é bem-sucedido para to_tsvector('english', 'hello world') , com 'english' sendo um literal de string não tipado . Mas falha com um parâmetro digitado varchar , porque não há registro implícito converter de varchar para regconfig . O manual:

Descarte funções candidatas para as quais os tipos de entrada não correspondem e não podem ser convertidos (usando uma função implícita conversão) para corresponder. literais desconhecidos são considerados conversíveis para qualquer coisa para este propósito.

A ênfase em negrito é minha.
Os casts registrados 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

Explicação para castcontext :

castcontext char
Indica em quais contextos o cast pode ser invocado. e significa apenas como uma conversão explícita (usando CAST ou :: sintaxe). a significa implicitamente na atribuição a uma coluna de destino, bem como explicitamente. i significa implicitamente nas expressões, assim como nos demais casos.

Leia mais sobre os três diferentes tipos de atribuição no capítulo CRIAR ELENCO.