如何使用字符串更新text []字段

时间:2013-08-29 16:06:13

标签: postgresql

我有一个带有一个名为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.

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

在PostgreSQL的类型系统中,文字'My New String'不是varchartext值,而是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的原始(未经编辑的)问题的回应。其他答案包含与更新问题相关的更多详细信息。