这个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字段类型,但是根据文档,此调用应该是完全正确的吗?
to_tsvector
varchar
使用显式类型转换:
SELECT language, to_tsvector(language **::regconfig** , 'hello world') FROM languages;
或更改列languages.language输入regconfig。
languages.language
regconfig
Postgres允许函数重载。函数签名是由它们的(可选的,由 模式 限定的) 名称 加上 输入参数类型 (的列表)定义的。to_tsvector()期望类型的2参数形式 regconfig 作为第一个参数:
to_tsvector()
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了参数而失败,因为没有从到的已注册 隐式 强制类型varchar转换regconfig。手册:
to_tsvector('english', 'hello world')
'english'
丢弃输入类型不匹配且无法转换(使用 隐式 转换)匹配的候选函数。为此目的, 未知的文字 被假定可以转换为任何东西。
大胆强调我的。 已注册的演员表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
解释castcontext:
castcontext
castcontext char 指示可以在其中调用转换的上下文。e仅表示为显式转换(使用CAST或::语法)。a 意味着隐式分配给目标列以及显式分配。i和其他情况一样,在表达式中隐含地表示。
castcontext char
e
CAST
::
a
i
在CREATE CAST一章中了解有关三种不同 类型分配的 更多信息。