Redshift - 提取匹配数组中条件的值

Posted

技术标签:

【中文标题】Redshift - 提取匹配数组中条件的值【英文标题】:Redshift - Extract value matching a condition in Array 【发布时间】:2018-08-27 16:49:21 【问题描述】:

我有一个包含以下列的 Redshift 表

请问如何从该列中提取以 cat_ 开头的值(每一行只有一个,并且在数组中的不同位置)?

我想得到这些结果:

猫事件

cat_feature_missing

cat_duplicated_request

谢谢!

【问题讨论】:

【参考方案1】:

没有简单的方法从 SQL 中的一列中提取多个值(或者至少在 Redshift 使用的 SQL 中没有)。

您可以编写一个User-Defined Function (UDF),它返回一个包含这些值的字符串,用换行符分隔。这是否可以接受取决于您希望对输出做什么(例如 JOIN 反对它)。

另一种选择是在数据加载到 Redshift 之前预处理数据,将这些信息放在单独的一对多中em> 表,每个值都在自己的行中。然后返回此信息将是微不足道的。

【讨论】:

【参考方案2】:

您可以使用计数表(带有数字的表)来执行此操作。查看此链接以了解如何创建此表:http://www.sqlservercentral.com/articles/T-SQL/62867/

以下是您将如何使用它的示例。在现实生活中,您应该将临时 #tally 表替换为永久表。

--create sample table with data
create table #a (tags varchar(500));

insert into #a
select 'blah,cat_incident,mcr_close_ticket'
union
select 'blah-blah,cat_feature_missing,cat_duplicated_request';

--create tally table
create table #tally(n int);
insert into #tally
select 1
union select 2
union select 3
union select 4
union select 5
;

--get tags
select * from
(
select TRIM(SPLIT_PART(a.tags, ',', t.n)) AS single_tag
from #tally t
inner join #a a ON t.n <= REGEXP_COUNT(a.tags, ',') + 1 and n<1000
)
where single_tag like 'cat%'
;

【讨论】:

【参考方案3】:

谢谢! 最后,我设法通过以下查询做到了:

SELECT SUBSTRING(SUBSTRING(tags, charindex('cat_', tags), len(tags)), 0, charindex(',', SUBSTRING(tags, charindex('cat_', tags), len(tags)))) tags
FROM table

【讨论】:

以上是关于Redshift - 提取匹配数组中条件的值的主要内容,如果未能解决你的问题,请参考以下文章

带有R中条件的内连接

选择满足 SQL 中条件的元组列表

符合列表中条件的连续元素的子列表 c# linq

left join on 和where中条件的放置位置

SQL Server - 如何确定select查询中条件的优先级

C ++如何一起使用 std::adjacent 和 std::count_if 来计算向量中条件的出现次数