PostgreSQL CASE:文本数组中的位置

时间:2012-12-03 10:27:57

标签: postgresql sql-update case

我目前成功使用CASE表达式根据其他列的属性更新空列。例如

UPDATE table SET cat = CASE 
WHEN term = '{"Boulder"}' then 'Boulder'

但是,我需要在文本数组上执行相同的操作,特别是当元素位于该数组中的特定位置时。

例如,如果数据看起来像

{"Boulder, Tree, Bush"}

WHEN position('Tree' in term) > 0 then 'Boulder'

但是我收到错误消息

函数pg_catalog.position(字符变化[],未知)不存在

我之前在函数中使用过position所以我不确定为什么PostgreSQL在这种情况下不喜欢它。

有没有办法在确定文本元素在数组中的位置时使用CASE表达式。

1 个答案:

答案 0 :(得分:0)

显然,您的term列被定义为数组,例如varchar[]position函数仅适用于标量值,而不适用于数组。

如果要测试数组中是否包含元素,则需要使用其他运算符:@>

update foobar
   set cat = 'Boulder'
where term @> '{"Boulder"}'

表达式'{"Boulder"}'创建一个包含单个元素的数组。它相当于array['Boulder'](我发现它更具可读性)。因此,上面的where条件更新了数组term包含运算符右侧数组的所有元素的所有行。在这种情况下,它只是您正在测试的单个元素。

有关阵列函数和运算符的更多详细信息,请参见手册:http://www.postgresql.org/docs/current/static/functions-array.html

在要求更改后进行修改

要查找和更新位于第一,第二或第三位的巨石,您可以使用:

update foobar
   set cat = 'Boulder'
where 'Boulder' in (term[1], term[2], term[3]);