比较Null的数组字段,等于,不等于 - Postgres

时间:2018-02-05 17:02:46

标签: postgresql

表名:客户

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;

有人可以帮忙吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

如果您想使用实际数组,则需要先清理数据,使其格式正确 - 即没有前导/尾随逗号。完成此操作后,您可以将profiles字段作为数组数据类型进行过操作并使用数组连接,类似于:

SELECT 
  ARRAY(SELECT DISTINCT UNNEST(customers.profiles || customers_backup.profiles))
FROM ...

这应该将你的数组元素合并为一个数组,然后将其与删除重复的元素,然后最终组合回最终的数组。我不认为他们会被订购,但这应该让你开始。

看起来您的profile值不是真正的数组,因此您需要在上面的查询中将它们作为数组进行CAST。

答案 1 :(得分:0)

您可以使用UPDATEFROM语法。 请注意,可以使用=<>运算符比较数组。 仅用于查找联合(第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的运算符。

DEMO