字符串列表中是否存在字符串值?红移查询

时间:2019-05-03 21:30:16

标签: amazon-redshift

我有一些有趣的数据,我正在尝试查询,但是语法不正确。我有一个临时表(temp_id),其中已经充满了我关心的id值。在此示例中,只有两个ID。

CREATE TEMPORARY TABLE temp_id (id bigint PRIMARY KEY);
INSERT INTO temp_id (id) VALUES ( 1 ), ( 2 );

我在生产中有另一个表(我们称其为foo),该表在单个单元格中拥有多个ID。 ids列看起来像这样(下),其中id是一个由“ |”分隔的单个字符串

ids 
-----------
1|9|3|4|5
6|5|6|9|7
NULL
2|5|6|9|7
9|11|12|99

我想评估foo.ids中的每个单元格,看看是否有ids中的任何一个与我的temp_id表中的单元格匹配。

预期产量

ids         |does_match
-----------------------
1|9|3|4|5   |true
6|5|6|9|7   |false
NULL        |false
2|5|6|9|7   |true
9|11|12|99  |false

到目前为止,我已经提出了这个建议,但是我似乎什么也没返回。我没有尝试创建新列does_match,而是尝试在WHERE语句中进行过滤。但是,问题是我无法弄清楚如何将临时表中的所有id值评估为idsfoo的字符串blob。

SELECT
    ids,
FROM foo
WHERE ids = ANY(SELECT LISTAGG(id, ' | ') FROM temp_ids)

任何建议都会有所帮助。

干杯

2 个答案:

答案 0 :(得分:1)

以下SQL(我知道这有点hack)会返回您期望的结果,并使用示例数据进行了测试,不知道它在实际数据上的表现如何,请尝试让我知道< / p>

with seq AS (                # create a sequence CTE to implement postgres' unnest
select 1 as i union all      # assuming you have max 10 ids in ids field, 
                             # feel free to modify this part
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7 union all
select 8 union all
select 9 union all
select 10)

select distinct ids, 
    case             # since I can't do a max on a boolean field, used two cases 
                     # for 1s and 0s and converted them to boolean
       when max(case        
          when t.id in (
                select split_part(ids,'|',seq.i) as tt
                  from seq
                  join foo f on seq.i <= REGEXP_COUNT(ids, '|') + 1
                 where tt != '' and k.ids = f.ids)
          then 1 
          else 0 
          end) = 1 
       then true 
       else false 
    end as does_match
from temp_id t, foo 
group by 1

请告诉我这是否适合您!

答案 1 :(得分:1)

这可以,但是不确定性能

SELECT
    ids
FROM foo
JOIN temp_ids 
ON '|'||foo.ids||'|' LIKE '%|'||temp_ids.id::varchar||'|%'

您将ID列表包装在一对其他分隔符中,因此您始终可以搜索|id|,包括第一个和最后一个数字