我们说我有一个自定义字段表,并且可以将自定义字段分组。让我们说我有一个小组表。
我们还说我有一个约定,即自定义字段名称的前缀应该是groupName_,其中groupName是groups表的标题列。
如何更新大量现有自定义字段以在SQL中获取组ID?我试过这个:
UPDATE fields, fgroup
SET group_id = fgroup.id
WHERE name LIKE 'gp1\_%' AND SUBSTRING(name, 0, 4)) = lower(title) AND fields.account_id=fgroup.account_id AND fields.account_id = 111;
此操作失败,因为更新不会占用多个表。
如何为组名列表(gp1,gp2,gp3,gp4)执行此操作?我怎么能修改前缀长度? (并不总是SUBSTRING(name, 0, 4)
,而是根据前缀的长度填充第三个参数,直到第一个下划线?
答案 0 :(得分:1)
您的查询看起来像SQL-Server或MySQL语法。在Postgres中,您只能在单个语句中更新单个表。使用FROM
子句加入其他表。 Details in the manual.
对于单个组(每个列所属的猜测工作)
UPDATE fields f
SET group = g.id
FROM fgroup g
WHERE f.name LIKE 'gp1\_%'
AND left(f.name, 4) = lower(g.title)
AND f.account_id = 111
AND f.account_id = g.account_id;
对于多个群组和a,引用:populated third parameter based on the length of the prefix
,我们将其命名为prefix_len
:
UPDATE fields f
SET group = g.id
FROM fgroup g
WHERE left(f.name, prefix_len) = ANY '{gp1,gp2,gp3,gp4}'::text[]
AND left(f.name, prefix_len) = lower(g.title)
AND f.account_id = 111
AND f.account_id = g.account_id;
除此之外:group
is a reserved word,请勿将其用作标识符。