bigquery内部错误案例条件

时间:2016-10-10 10:55:21

标签: google-bigquery internal

运行查询时出现内部错误,因为特殊情况包括'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')

第一个查询的作业ID为:cpcd-1357:bquijob_24edf89_157ae353e1e

最后一个查询:cpcd-1357:bquijob_1b26172b_157ae348938

任何人都知道如何避免此错误?

1 个答案:

答案 0 :(得分:0)

看起来你在遗留SQL中遇到了与在条件中使用重复列相关的边缘情况。如果您通过取消选中用户界面中“显示选项”下的“使用旧版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');

此查询“展平”重复,以便与geo进行比较。

或者,您可以将FLATTEN运算符与旧SQL一起使用来解决内部错误:

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之间差异的更多信息。