我目前成功使用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表达式。
答案 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]);