匹配值列表中的字符串并创建新行
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【讨论】:
以上是关于匹配值列表中的字符串并创建新行的主要内容,如果未能解决你的问题,请参考以下文章