我有一个带有一个名为tags的字段的表,它可以包含任意数量的字符串:
Table "public.page"
Column | Type | Modifiers
----------------------+--------------------------+----------------------------------
tags | text[] | not null default ARRAY[]::text[]
我想在tags字段中添加一个字符串 - 但我似乎无法让concat函数为我工作。我试过了:
update page set tags=concat('My New String',tags);
ERROR: function concat(unknown, text[]) does not exist
LINE 1: update page set tags=concat('My New String',tags) where ...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
和
update page set tags=('My New String'||tags);
ERROR: operator is not unique: unknown || text[]
LINE 1: update page set tags = ('My New String' || tags) where w...
^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts.
有什么想法吗?
答案 0 :(得分:4)
在PostgreSQL的类型系统中,文字'My New String'
不是varchar
或text
值,而是unknown
类型的文字,可以按任何类型处理。 (例如,date
的字面值可以是'2013-08-29'
;这不会被处理为varchar
,然后转换为date
,它将被解释为“ date
字面意思“处于非常低的水平。”
通常,PostgreSQL可以自动推断出类型,但是当它不能时,你需要使用以下其中一个来告诉它你希望文字被视为text
:
text 'My New String'
(SQL标准文字语法)Cast('My New String' as text)
(SQL标准的演员语法,但在此上下文中并不是真正的演员)'My New String'::text
(PostgreSQL非标准演员语法,但非常易读)在您的情况下,错误消息operator is not unique: unknown || text[]
表示Postgres可以将多种类型解释为文字,每种类型都有自己对||
运算符的定义。
因此你需要这样的东西(我已经删除了不必要的括号):
update page set tags = 'My New String'::text || tags;
答案 1 :(得分:0)
您是否尝试||
连接?
select array['abc','def']::text[] || 'qwerty'::text;
http://www.postgresql.org/docs/current/static/functions-array.html#ARRAY-OPERATORS-TABLE
注意:这个答案是对OP的原始(未经编辑的)问题的回应。其他答案包含与更新问题相关的更多详细信息。