sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL ERROR:functie to_tsvector (karakter variërend, onbekend) bestaat niet

Gebruik een expliciete typecast:

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

Of wijzig de kolom languages.language om regconfig . te typen . Zie het antwoord van @Swav.

Waarom?

Postgres maakt overbelasting van functies mogelijk. Functiehandtekeningen worden gedefinieerd door hun (optioneel schema -gekwalificeerd) naam plus (de lijst van) type invoerparameter (s). De 2-parametervorm van to_tsvector() verwacht type regconfig als eerste 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

Als geen bestaande functie exact overeenkomt , bepalen de regels van Function Type Resolution de beste match - indien aanwezig. Dit is gelukt voor to_tsvector('english', 'hello world') , met 'english' een niet-getypeerde tekenreeks zijn . Maar mislukt met een parameter getypt varchar , omdat er geen impliciete . is geregistreerd cast van varchar naar regconfig . De handleiding:

Gooi kandidaatfuncties weg waarvoor de invoertypen niet overeenkomen en die niet kunnen worden geconverteerd (met een impliciete conversie) overeenkomen. onbekende letterlijke worden verondersteld om te zetten in iets voor dit doel.

Vetgedrukte nadruk van mij.
De geregistreerde casts voor 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

Uitleg voor castcontext :

castcontext char
Geeft aan in welke contexten de cast kan worden aangeroepen. e betekent alleen als een expliciete cast (met behulp van CAST of :: syntaxis). a betekent zowel impliciet in toewijzing aan een doelkolom als expliciet. i betekent impliciet in uitdrukkingen, evenals de andere gevallen.

Lees meer over de drie verschillende soorten opdrachten in het hoofdstuk CREER CAST.



  1. Microsoft Access-webapp versus desktopdatabase

  2. Uw database exporteren voor overdracht

  3. Een vooraf ingevulde database werkt niet bij API 28 genereert geen dergelijke tabeluitzondering

  4. Architecten voor beveiliging:een gids voor MySQL