【问题标题】:PostgreSQL parse countries in array against the countries tablePostgreSQL 根据国家表解析国家/地区
【发布时间】:2020-02-27 19:25:25
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: sql arrays postgresql unnest lateral-join


    【解决方案1】:

    您可以将每个数组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
    

    Demo on DB Fiddle

    国家表:

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

    目录:

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

    查询结果:

    编号 |国家 |国家的名字 -: | :--------------- | :----------- 1 | {阿尔巴尼亚,法国} |法国

    【讨论】:

    • 太棒了。谢谢你。 unnest 成功了。发现一堆不同。还必须在加入时使用 INITCAP。干杯!
    • 抱歉耽搁了。以为我最初是这样做的:)
    【解决方案2】:

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

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

    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。这将确保明确的关系。

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

    【讨论】:

    • 感谢 Gordon,unnest 确实很有魅力。这是一个遗留数据库,所以必须处理它。干杯!
    • @RandyMcKay 。 . .我只是注意到这个答案比另一个答案早了 10 分钟。
    • 是的,但是很遗憾我不能给出两个正确的答案,所以我赞成你的。您的 cmets 非常明智,我很欣赏他们,但另一个答案“对找到我的解决方案最有帮助”(刻度上的工具提示中的文字)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多