PostgreSQL:array_append()如果不存在则创建ARRAY

4zcjmb1e  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(165)

我的数据库(PostgreSQL 9.4.18)中有一个现有的users表,我正在修改它:

ALTER TABLE users
    ADD COLUMN IF NOT EXISTS groups INT[];

到目前为止一切顺利。
我有一个SQL语句,它使用array_append()为我的用户添加组:

// NOTE: this bit prevents duplicate entries and casts to integer value --> NOT (groups @> ARRAY[?]::INT[])

UPDATE users
SET groups = array_append(groups, ?)
WHERE NOT (groups @> ARRAY[?]::INT[])
  AND id = ?

这条语句可以正常工作--但仅当所选用户将groups定义为数组时。
如果匹配的用户没有定义groups数组(null?),则该语句将不执行任何操作。

# SELECT id, groups FROM users WHERE id=11111;
  id   | groups
-------+-------
 11111 |
(1 row)

我的问题是:
如果一个空数组不存在,如何修改SQL语句以首先创建一个空数组?
我试过使用像COALESCE()这样的函数注入一个空数组作为默认值,但没有任何运气......但我可能只是没有正确地处理这个问题。
帮忙?

vd2z7a6w

vd2z7a6w1#

可以使用coalesce()创建一个空数组,并将新值追加到该数组中:

UPDATE users
  SET groups = array_append(coalesce(groups,'{}'), ?)
WHERE ? <> ALL (coalesce(groups, '{}'))
  AND id = ?

注意,NOT (groups @> ARRAY[?]::INT[])可以简化(在我看来)为? <> all(groups)

相关问题