当前位置: 首页 > 面试题库 >

PostgreSQL错误:函数to_tsvector(字符变化,未知)不存在

邹开畅
2023-03-14
问题内容

这个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参数形式
regconfig
作为第一个参数:

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。手册:

丢弃输入类型不匹配且无法转换(使用 隐式 转换)匹配的候选函数。为此目的, 未知的文字 被假定可以转换为任何东西。

大胆强调我的。
已注册的演员表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 char
指示可以在其中调用转换的上下文。e仅表示为显式转换(使用CAST::语法)。a
意味着隐式分配给目标列以及显式分配。i和其他情况一样,在表达式中隐含地表示。

在CREATE CAST一章中了解有关三种不同 类型分配的
更多信息。



 类似资料:
  • 问题内容: 我有一个spring应用程序,并且我有一个使用以下语法的本地查询: 我得到了错误: 作为数据库,我使用PostgreSQL。我提到在mysql中,查询有效。 问题答案: Postgres不支持多于一列。但是,您可以使用以下类似的方法将两列简单地转换为匿名记录类型的单列:-这是匿名记录类型的单列。 注意两列的括号。 但是,在Postgres中,通过在子句中使用条件聚合,您可以采用一种更优

  • 好吧,为了大学,我正在做一些SQL作业,但是我不知道这里有什么问题...坚持了几个小时。 所以在这里我创建了一个函数: 然后我尝试插入一个新行: 继续获取此错误: 错误:函数ins_notitie(未知,带时区的时间戳,未知,带时区的时间戳)不存在 第1行:选择ins_notitie('100001',now(),'Test note',now()) 错误:函数ins_notitie(未知,带时区

  • 执行简单查询时出现操作符不匹配错误。这是什么原因造成的? 表定义:

  • 我正在做一个网站,有一个预订功能。我想要一份我目前日期的预订清单。

  • 问题内容: 我有一个MySQL转储,尝试将其恢复为: 但是,这引发了一个错误: 这是第3231-3233行: 我正在使用MySQL 5.1.69。我该如何解决这个错误? 问题答案: 您的版本不支持该字符集,我相信是它引入的。您应该将mysql升级到用于导出该文件的版本。 然后,错误就很明显了:您在代码中设置了某个字符集,但是您的mysql版本不支持该字符集,因此对此一无所知。 根据https://

  • 问题内容: 最近,我已将Postgres从8.2迁移到8.4。当我运行我的应用程序并尝试登录时,出现这些错误 我已经通过执行这些to_date函数签入了我的postgres 它给我错误函数to_date不存在 当我在postgres 8.2中执行相同的查询时,我没有收到错误 请帮助我解决这些问题。 问题答案: 似乎它所需要的只是从时间戳到文本的转换,因为函数定义为:to_date(text,tex