我有一些有趣的数据,我正在尝试查询,但是语法不正确。我有一个临时表(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
值评估为ids
中foo
的字符串blob。
SELECT
ids,
FROM foo
WHERE ids = ANY(SELECT LISTAGG(id, ' | ') FROM temp_ids)
任何建议都会有所帮助。
干杯
答案 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|
,包括第一个和最后一个数字