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 - 提取匹配数组中条件的值的主要内容,如果未能解决你的问题,请参考以下文章