在BigQuery中,我有table1
,其中有一个(不可为空)列id
,该列始终是5位整数。我想将其与table2
一起加入,其中id
还有一列id
,这些列是这些相同ID的(可空)字符串。
麻烦的是,table2
中的82795
82795
NULL
84660
84120 / 82795
73844 / 73845
73844 / 73845
NULL
83793 / 84758
73844 / 73845 / 84122 / 84136
73844 / 73845 / 84136
84845
也可能是'/'分隔ID的列表。
以下是该列的示例:
SELECT * FROM table1
LEFT JOIN table2
ON table1.id IN SPLIT(table2.id, ' / ')
如何用类似的逻辑实现某些目标:
promise
答案 0 :(得分:1)
我同意Tim关于规范化表的说法,但是在此期间,您应该可以将IN
与UNNEST
一起使用来搜索SPLIT
的结果:
SELECT * FROM table1
LEFT JOIN table2
ON table1.id IN UNNEST(SPLIT(table2.id, ' / '))
答案 1 :(得分:0)
您应该考虑标准化第二张表,以使每个react-router-dom
值都出现在单独的记录中。作为当前情况的解决方法,您可以尝试以下操作:
id
上面的SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON CONCAT(' ', t2.id, ' ') LIKE CONCAT('% ', CAST(t1.id AS STRING), ' %');
子句是一个技巧,可以在table2 ON
中的某个地方搜索table1 id
。它通过用空格填充后者来起作用,这样我们只需要搜索被空格包围的table1 id
。
答案 2 :(得分:0)
我同意尼克的说法,但我认为此版本在BigQuery中效果更好:
with table1 as (
select 82795 as id union all
SELECT 1234 UNION ALL
SELECT 84122
),
table2 as (
SELECT '84120 / 82795' as id UNION ALL
SELECT '73844 / 73845 / 84122 / 84136'
)
SELECT t1, t2
FROM table1 t1 LEFT JOIN
(table2 t2 CROSS JOIN
UNNEST(SPLIT(t2.id, ' / ')) t2id
)
ON t1.id = safe_cast(t2id as int64);
(上面的作品。)
注意:
=
使用LEFT JOIN
时,BigQuery抱怨。table1.id
是一个数字。需要转换字符串以进行比较。SELECT
中不允许使用重复的列名,因此SELECT *
不起作用。一种简单的解决方法是将值选择为记录而不是列。