将联接中用逗号分隔的值插入到特定列中

时间:2018-06-19 11:27:11

标签: sql amazon-redshift

我的登台表中有一个名为event_list的列,它是数据类型的varchar,看起来像: 1,2,3,4,5,... 我需要的是通过使用JOIN函数将查找表中的适当值插入上述事实的事实表中。 值1,值2,值3,值4,值5,... 因此,我尝试执行一个简单的联接并从查找表中获取值,然后将其插入事实中,这显然不起作用。 左外加入public.event AS作为“事件” ON“ carnivaldata” .event_list =“ event” .id 在上面的查询中,我尝试根据暂存中的event_list列和事件查找表中的id字段进行联接。但是结果是空的。 我要去哪里错了?这是正确的方法吗?任何帮助,不胜感激。 编辑: 样本元数据 staging_table <---登台表 event_list <-----列 1,2 23,24 5,6 event_list查找表<---查找表 id值 1值1 2值2 23价值23 24值24 5值5 6值6 Expected_fact_table <---事实表(预期结果) event_list <---列 值1,值2 值23,值24 值5,值6 加入: 插入INTO public.fact_table(event_list) 选择“ event” .value AS event_list FROM public.staging_table AS“ staging_table” 左外联接public.event_lookup AS“事件” ON“ staging_table” .event_list =“ event” .id

3 个答案:

答案 0 :(得分:1)

您可以将逻辑表示为:

SELECT el.value AS event_list
FROM public.staging_table st LEFT OUTER JOIN
     public.event_lookup el
     ON ',' || st.event_list || ',' LIKE '%,' || el.id || ',%';

我不确定这是否会有合理的表现。您确实需要更改数据结构。这种类型的操作绝对不是Redshift所适合的(实际上,Postgres更好,因为您可以轻松地将值嵌套到不同的行中)。

答案 1 :(得分:1)

根据this,您可以使用 UNNEST( STRING_TO_ARRAY(tags, ',') )提取值,然后进行必要的联接,然后使用string_agg(expression, delimiter)可以按照here

进行连接

答案 2 :(得分:0)

您可以尝试跟踪动态查询

DECLARE @event_list nvarchar(MAX) = N'SELECT event_list FROM public.staging_table WHERE id = 3'

DECLARE @insert nvarchar(MAX) = N'
INSERT INTO public.fact_table (event_list)
SELECT value FROM public.event_lookup WHERE id in (' + @event_list +')'

EXEC sp_executesql @INSERT