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

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

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

我想得到这些结果:

猫事件

cat_feature_missing

cat_duplicated_request

谢谢!

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-28
          • 2012-07-06
          • 1970-01-01
          • 1970-01-01
          • 2021-12-25
          相关资源
          最近更新 更多