1

我们有内容和国家/地区表。 国家非常简单:国家名称列定义为字符串:阿尔巴尼亚、比利时、中国、丹麦等...

内容是一个包含 50 万行的表格,其中包含各种数据,国家列定义为数组 text[]。每个值都有多个国家级联,例如:{"丹麦、芬兰、法国、德国、爱尔兰、英国、意大利、荷兰、波兰、俄罗斯、西班牙、瑞典、澳大利亚、巴西、加拿大、中国、印度、印度尼西亚、日本,马来西亚,越南,墨西哥,"韩国",泰国,美国,新加坡,阿联酋"}

来自内部团队的更新是针对一千条记录,我们不确定国家/地区是否都拼写正确。因此,任务是与国家表中的 country_name 进行核对。

我正在做replace(replace(country_array::text,'{',''),'}','') as country_text并考虑做 UNPIVOT 来检查国家表的每一列。是否有任何其他更简单的方法来确保 Content 表中的国家/地区数组具有来自国家/地区表的有效国家/地区名称?

谢谢

4

2 回答 2

3

您可以将unnest()每个数组归为一组行,并确保所有值都出现在country表中。以下查询为您提供参考表中缺少的数组元素:

select *
from 
    content c
    cross join lateral unnest(c.countries) as t(country_name)
    left join country y on y.country_name = t.country_name
where y.country_name is null

DB Fiddle 上的演示

国家表:

编号 | 国家的名字
-: | :-----------
 1 | 阿尔巴尼亚     
 2 | 丹麦     

内容表:

编号 | 国家        
-: | :----------------
 1 | {阿尔巴尼亚,丹麦}
 1 | {阿尔巴尼亚,法国}

查询结果:

编号 | 国家 | 国家的名字
-: | :--------------- | :-----------
 1 | {阿尔巴尼亚,法国} | 法国      
于 2019-11-01T14:10:57.090 回答
1

如果您对某些国家拼写不正确有疑问,那么毫无疑问会有这样的例子。

首先获取不在参考表中的国家/地区列表:

select c_country, count(*)
from content c cross join lateral
     unnnest(c.countries) c_country left join
     countries co
     on co.country_name = c_country
where co.country_name is not null
group by c_country
order by count(*) desc;

然后,您可以进入并修复数据。

先验地将值存储在数组中并没有错。但是,如果您是从头开始设计数据库,我可能会推荐一个contentCountries表和一个countryId. 这将确保明确的关系。

在您的情况下,您可能应该修复摄取过程,以便在输入时知道这些值是正确的。鉴于您已经拥有大量数据并且只需要修复它,这可能就足够了。

于 2019-11-01T13:59:55.230 回答