以下 BigQuery 标准 SQL 示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'abc' name, '1,2,5,6' departments UNION ALL
SELECT 'xyz', '4,5' UNION ALL
SELECT 'pqr', '3,4,6'
)
SELECT
name,
IF(departments LIKE '%1%', 1, 0) AS d1,
IF(departments LIKE '%2%', 1, 0) AS d2,
IF(departments LIKE '%3%', 1, 0) AS d3,
IF(departments LIKE '%4%', 1, 0) AS d4,
IF(departments LIKE '%5%', 1, 0) AS d5,
IF(departments LIKE '%6%', 1, 0) AS d6
FROM `project.dataset.table`
结果为
Row name d1 d2 d3 d4 d5 d6
1 abc 1 1 0 0 1 1
2 xyz 0 0 0 1 1 0
3 pqr 0 0 1 1 0 1
因此,您需要在目的地上方运行到您准备的任何新表
注意,以上假设您只有 6 个部门,最重要的是数字没有歧义,例如 1 与 10 不冲突
如果你确实有这种情况 - 你需要在下面进行转换
IF(departments LIKE '%2%', 1, 0) AS d2,
进入
IF(CONCAT(',', departments, ',') LIKE '%,2,%', 1, 0) AS d2 ...
当然,您可以只使用一个简单的 INSERT 语句
INSERT `project.dataset.new_table` (name, d1, d2, d3, d4, d5, d6)
SELECT
name,
IF(departments LIKE '%1%', 1, 0) AS d1,
IF(departments LIKE '%2%', 1, 0) AS d2,
IF(departments LIKE '%3%', 1, 0) AS d3,
IF(departments LIKE '%4%', 1, 0) AS d4,
IF(departments LIKE '%5%', 1, 0) AS d5,
IF(departments LIKE '%6%', 1, 0) AS d6
FROM `project.dataset.table`
所以,这一切的最后一点是:
而不是为原始表中的每一行生成 INSERT STATEMENT - 您应该生成简单的 SELECT 语句来“旋转”
“极端”最小化生成代码的更新
看一个例子:
#standardSQL
CREATE TEMP FUNCTION c(departments STRING, department INT64) AS (
IF(departments LIKE CONCAT('%',CAST(department AS STRING),'%'), 1, 0)
);
WITH `project.dataset.table` AS (
SELECT 'abc' name, '1,2,5,6' departments UNION ALL
SELECT 'xyz', '4,5' UNION ALL
SELECT 'pqr', '3,4,6'
), temp AS (
SELECT name, departments AS d
FROM `project.dataset.table`
)
SELECT
name,
c(d,1)d1,
c(d,2)d2,
c(d,3)d3,
c(d,4)d4,
c(d,5)d5,
c(d,6)d6
FROM temp
如您所见 - 现在您的 10000 行中的每一行都类似于 c(d,N)dN,,最大长度为 c(d,10000)d10000,,因此您有机会适应查询大小限制