匹配值列表中的字符串并创建新行

Posted

技术标签:

【中文标题】匹配值列表中的字符串并创建新行【英文标题】:match a string from a list of values and create new row 【发布时间】:2015-05-07 10:29:41 【问题描述】:

这是为所有 SQL 开发人员准备的,这很容易,但可以发布。 我有一张包含世界上所有国家/地区名称的表格。 我有另一个表,其中有一个句子,其中包含多个国家名称。如何提取国家名称并将它们放在单独的行中,如下所示

Country_Universe_Table 美国 印度 不丹 尼泊尔 伊朗dataid           评论 1        美国和印度已签署协议 2        英国、尼泊尔和不丹天气寒冷

输出应为dataid           Country 1          美国 1          印度 2          英国 2          尼泊尔 2           不丹

【问题讨论】:

你能展示示例数据和预期输出吗? 1和2从何而来? @vivek - 我编辑了问题并包含了数据集。 @jarlh - 1 和 2 是唯一 ID 【参考方案1】:

以下是做你想做的不完美的方法:

select c.dataid, cut.country
from Country_Universe_Table cut join
     comments c
     on c.comment like '%' || cut.country || '%'

这只是在 cmets 表中查找国家/地区字符串。但是,它会将“American”匹配到“America”,将“UKELELE”匹配到“UK”。这可能已经足够满足您的需要了。

编辑:

您可以通过将评论拆分为单词然后使用横向连接进行比较来增强这一点(在更新的 Postgres 版本中):

select c.dataid, cut.country
from comments c cross join lateral
     regexp_split_to_table(c.comment, E'[.,-() ]+') as w(word) join
     Country_Universe_Table cut
     on w.word = cut.country;

【讨论】:

【参考方案2】:

短: 将您的字符串转换为数组并使用array contains operator @>:

SELECT c.dataid, cut.country
FROM   comments c
JOIN   country_universe_table cut
       ON string_to_array(c.comments, ' ') @> ARRAY[cut.country];

您的专栏应该真正命名为comment(单数)。

更快:

SELECT c.dataid, cut.country
FROM   comments c
     , unnest(string_to_array(c.comments, ' ')) u(country)
JOIN   country_universe_table cut USING (country);

相关:

Split column into multiple rows in Postgres

【讨论】:

以上是关于匹配值列表中的字符串并创建新行的主要内容,如果未能解决你的问题,请参考以下文章

从列表中获取匹配字符串并创建新列表

Hive查询:匹配列数组的字符串值以生成标志

在两个列表列表中查找匹配的字符串

将字符串与字典值完全匹配并检索键 - python

将字符串与元组列表匹配

使用 Python 有效地查找部分字符串匹配 --> 从 5 GB 文件中的值列表开始的值