PostgreSQL错误:函数to_tsvector(字符变化,未知)不存在
这个psql会话代码段应该是不言自明的:
psql (9.1.7)Type "help" for help.
=> CREATE TABLE languages(language VARCHAR NOT NULL);
CREATE TABLE
=> INSERT INTO languages VALUES ('english'),('french'),('turkish');
INSERT 0 3
=> SELECT language, to_tsvector('english', 'hello world') FROM languages;
language| to_tsvector
---------+---------------------
english | 'hello':1 'world':2
french | 'hello':1 'world':2
turkish | 'hello':1 'world':2
(3 rows)
=> SELECT language, to_tsvector(language, 'hello world') FROM languages;
ERROR: function to_tsvector(character varying, unknown) does not exist
LINE 1: select language, to_tsvector(language, 'hello world')...
^
HINT: No function matches the given name and argument types.
You might need to add explicit type casts.
问题是Postgres函数to_tsvector
不喜欢varchar
字段类型,但是根据文档,此调用应该是完全正确的吗?
回答:
使用显式类型转换:
SELECT language, to_tsvector(language **::regconfig** , 'hello world') FROM languages;
或更改列languages.language
输入regconfig
。
为什么?
Postgres允许函数重载。函数签名是由它们的(可选的,由 模式 限定的) 名称 加上 输入参数类型
(的列表)定义的。to_tsvector()
期望类型的2参数形式
作为第一个参数:
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
如果没有现有函数 完全
匹配,则“函数类型解析”规则将确定最佳匹配-如果有的话。这是成功的 to_tsvector('english', 'hello
world'),因为'english'
它是 。但由于 了参数而失败,因为没有从到的已注册
隐式
强制类型varchar
转换regconfig
。手册:
丢弃输入类型不匹配且无法转换(使用 转换)匹配的候选函数。为此目的, 被假定可以转换为任何东西。
大胆强调我的。
已注册的演员表regconfig
:
SELECT castsource::regtype, casttarget::regtype, castcontextFROM pg_catalog.pg_cast
WHERE casttarget = 'regconfig'::regtype;
castsource | casttarget | castcontext
------------+------------+-------------
oid | regconfig | i
bigint | regconfig | i
smallint | regconfig | i
integer | regconfig | i
解释castcontext
:
castcontext char
指示可以在其中调用转换的上下文。
e
仅表示为显式转换(使用CAST
或::
语法)。a
意味着隐式分配给目标列以及显式分配。
i
和其他情况一样,在表达式中隐含地表示。
在CREATE CAST一章中了解有关三种不同 类型分配的
更多信息。
以上是 PostgreSQL错误:函数to_tsvector(字符变化,未知)不存在 的全部内容, 来源链接: utcz.com/qa/403576.html