表名:客户
customer_id Profiles dept_code
------------------------------------------
3361 ,15,31,4, ,01,02,
3362 ,32, ,01,03,
3363 ,04,
3364 ,1,20,21, ,01,02,03,
表名:customers_backup
customer_id Profiles dept_code
--------------------------------------
3361 ,15,31,4, ,01,02,
3362 ,32,33,34, ,01,03,
3363 ,10, ,04,
3364 ,1,20,21, ,01,02,03,
我正在尝试更新CUSTOMERS表的PROFILE,条件如下,
1)如果客户资料为NULL =>更新customers_backup个人资料
2)如果客户资料等于customers_backup profile =>只是留住客户 轮廓 3)如果客户资料<>到customers_backup profile =>保留客户资料并附加customers_backup中不在customers表中的配置文件。
我需要以下输出:
表名:客户
customer_id Profiles dept_code
------------------------------------------------
3361 ,15,31,4, ,01,02,
3362 ,32,33,34, ,01,03, ( How to apply this condition?)
3363 ,10, ,04,
3364 ,1,20,21, ,01,02,03,
以下是我为条件1&但他们没有给出预期的结果。
update customers set profiles=
CASE WHEN (select unnest(array[customers.profiles])) is null
THEN customers_backup.profiles
WHEN (select unnest(array[customers.profiles])) =
(select unnest(array[customers_backup.profiles]))
THEN customers.profiles
WHEN (select unnest(array[customers.profiles])) <>
(select unnest(array[customers_backup.profiles])) --- Need help here
THEN user_enrollment_backup1.profiles
END FROM customers_backup
WHERE customers_backup.customer_id=customers.customer_id
AND customers_backup.dept_code= customers.dept_code;
有人可以帮忙吗?提前谢谢。
答案 0 :(得分:0)
如果您想使用实际数组,则需要先清理数据,使其格式正确 - 即没有前导/尾随逗号。完成此操作后,您可以将profiles
字段作为数组数据类型进行过操作并使用数组连接,类似于:
SELECT
ARRAY(SELECT DISTINCT UNNEST(customers.profiles || customers_backup.profiles))
FROM ...
这应该将你的数组元素合并为一个数组,然后将其与删除重复的元素,然后最终组合回最终的数组。我不认为他们会被订购,但这应该让你开始。
看起来您的profile
值不是真正的数组,因此您需要在上面的查询中将它们作为数组进行CAST。
答案 1 :(得分:0)
您可以使用UPDATE
表FROM
语法。
请注意,可以使用=
和<>
运算符比较数组。
仅用于查找联合(第3个案例),您可以使用UNNEST
。
UPDATE customers AS c
SET profiles = CASE WHEN c.profiles IS NULL
THEN cb.profiles
WHEN array[c.profiles] = array[cb.profiles]
THEN c.profiles
WHEN array[c.profiles] <> array[cb.profiles]
THEN ( select string_agg(a,'')
from (
select distinct
unnest(array[RTRIM(c.profiles,',')::VARCHAR] || array[cb.profiles]) as a
) s
)
END
FROM customers_backup as cb
WHERE c.customer_id = cb.customer_id;
另请注意,如果您create extension intarray,
,您可以使用简单的|数组UNION的运算符。