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

时间:2015-05-07 10:29:41

标签: sql regex postgresql postgresql-9.2

这适用于所有SQL开发人员,这很容易,但想发布。 我有一张桌子,里面有世界上所有国家的名字。 我有另一张表,其中有一个句子,里面有一个以上的国名。如何提取国家/地区名称并将其放在单独的行中,如下所示

Country_Universe_Table
美国
印度
不丹
尼泊尔
伊朗

dataid 评论
1美国和印度签署了一项协议 2英国,尼泊尔和不丹看到寒冷天气

输出应为
dataid 国家/地区
1美国 1印度
2英国
2尼泊尔
2不丹

2 个答案:

答案 0 :(得分:3)

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

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

这只是在评论表中查找国家/地区字符串。但是,它将“美国”与“美国”和“UKELELE”匹配为“英国”。这可能足以满足您的需求。

编辑:

您可以通过将注释拆分为单词然后使用横向连接进行比较来增强此功能(在更新版本的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;

答案 1 :(得分:1)

短:
将您的字符串转换为数组并使用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);

相关: