bigquery 内部错误案例条件
bigquery internal error case condtion
当 运行 查询作为特性包含 'CASE' 子句和 'WHEN' 子句中的两个不同字段时,我收到内部错误。查询如下:
SELECT
CASE WHEN site != 'a' OR geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
类似查询运行良好:
SELECT
CASE WHEN site != 'agderposten' OR geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
-
SELECT
CASE WHEN geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
-
SELECT
CASE WHEN site != 'a' AND geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
-
SELECT
CASE WHEN site != 'a' THEN "test" WHEN geo LIKE 'NO%' THEN "test" END
FROM
elc.CpEvents_agderposten
WHERE
_partitiontime BETWEEN TIMESTAMP('2014-09-24')
AND TIMESTAMP('2014-09-24')
我知道最后一个示例可以用作第一个查询的变通方法,但它不能始终适用。例如,以下查询也失败了:
SELECT
CASE WHEN site == 'a' and geo >= 'NO' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
第一次查询的job id是:cpcd-1357:bquijob_24edf89_157ae353e1e
最后一个查询:cpcd-1357:bquijob_1b26172b_157ae348938
有人知道如何避免这个错误吗?
您似乎遇到了旧版 SQL 中与在条件中使用重复列相关的边缘情况。如果您通过取消选中 UI 中 "Show Options" 下的 "Use Legacy SQL" 来启用 standard SQL,则以下查询应该有效:
SELECT
CASE WHEN site != 'a' OR geo LIKE 'NO%' THEN "test" END
FROM `elc.CpEvents_agderposten` t, t.geo geo
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24');
此查询 "flattens" 重复以便与 geo
进行比较。
或者,您可以使用带有遗留 SQL 的 FLATTEN
运算符来解决内部错误:
SELECT
CASE WHEN site != 'a' OR geo LIKE 'NO%' THEN "test" END
FROM FLATTEN([elc.CpEvents_agderposten], geo)
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
您可以在 migration guide.
中详细了解旧版和标准 SQL 之间的区别
当 运行 查询作为特性包含 'CASE' 子句和 'WHEN' 子句中的两个不同字段时,我收到内部错误。查询如下:
SELECT
CASE WHEN site != 'a' OR geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
类似查询运行良好:
SELECT
CASE WHEN site != 'agderposten' OR geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
-
SELECT
CASE WHEN geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
-
SELECT
CASE WHEN site != 'a' AND geo LIKE 'NO%' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
-
SELECT
CASE WHEN site != 'a' THEN "test" WHEN geo LIKE 'NO%' THEN "test" END
FROM
elc.CpEvents_agderposten
WHERE
_partitiontime BETWEEN TIMESTAMP('2014-09-24')
AND TIMESTAMP('2014-09-24')
我知道最后一个示例可以用作第一个查询的变通方法,但它不能始终适用。例如,以下查询也失败了:
SELECT
CASE WHEN site == 'a' and geo >= 'NO' THEN "test" END
FROM elc.CpEvents_agderposten
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
第一次查询的job id是:cpcd-1357:bquijob_24edf89_157ae353e1e
最后一个查询:cpcd-1357:bquijob_1b26172b_157ae348938
有人知道如何避免这个错误吗?
您似乎遇到了旧版 SQL 中与在条件中使用重复列相关的边缘情况。如果您通过取消选中 UI 中 "Show Options" 下的 "Use Legacy SQL" 来启用 standard SQL,则以下查询应该有效:
SELECT
CASE WHEN site != 'a' OR geo LIKE 'NO%' THEN "test" END
FROM `elc.CpEvents_agderposten` t, t.geo geo
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24');
此查询 "flattens" 重复以便与 geo
进行比较。
或者,您可以使用带有遗留 SQL 的 FLATTEN
运算符来解决内部错误:
SELECT
CASE WHEN site != 'a' OR geo LIKE 'NO%' THEN "test" END
FROM FLATTEN([elc.CpEvents_agderposten], geo)
WHERE _partitiontime BETWEEN TIMESTAMP('2014-09-24') AND TIMESTAMP('2014-09-24')
您可以在 migration guide.
中详细了解旧版和标准 SQL 之间的区别