0

我目前正在成功地使用 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(字符变化 [],未知)不存在

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

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

4

1 回答 1

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

需求改变后编辑

要仅查找和更新 boulder 位于第一、第二或第三的位置,您可以使用以下命令:

update foobar
   set cat = 'Boulder'
where 'Boulder' in (term[1], term[2], term[3]);
于 2012-12-03T12:17:07.523 回答