你好,我有下一个代码,当我在Bigquery里面运行它给我“正确”的答案,但当我把它放入一个sh脚本并执行google shell内的脚本vm给我下一个错误。有什么想法吗?
我想错误在于需要将case / when语句结果放在另一个case / when语句中。
这是我的代码的示例:
SELECT CASE WHEN (
(CASE WHEN TABLE1.COL1 = 'X' THEN 0 ELSE 1 END) *
(CASE WHEN TABLE2.COL2 = 'Y' THEN 1 ELSE 0 END) *
(CASE WHEN (SELECT 0
FROM TABLE3
WHERE TABLE3.ID = TABLE2.ID) = 0 THEN 0 ELSE 1 END)) = 1
THEN (SELECT '111111') ELSE NULL END
FROM TABLE1
INNER JOIN TABLE2
ON TABLE1.ID = TABLE2.ID
FULL JOIN (SELECT COL1,'TRUE' FROM TABLE4) AS XX
ON XX.COL1 = TABLE1.COL1 AND XX.COL1 IS NULL
WHERE
TABLE1.COL3 = 'YY'
我无法提供预期的结果,但该查询的结果给了我下一个错误:无法将括号表达式解析为表达式,结构构造函数或子查询...
我会发布调试技巧作为答案,因为我认为你可能会以这种方式找到问题。在命令行提示符下,列出最近的作业:
bq ls -j --all
失败的查询作业可能位于顶部。复制作业ID并将其与下一个命令一起使用:
bq --prettyformat=json show -j YOUR_JOB_ID
这将打印出完整的作业配置以及错误消息。我怀疑你会看到查询是乱码;引用或其他一些字符可能在shell解释时导致意外行为。从命令行执行查询时,最好将内容放在一个文件中,然后将其作为输入传递给bq工具,例如:
bq query --use_legacy_sql=false < query.sql
这可以防止shell作为命令拦截查询的任何部分。
谢谢@Elliott Brossard,我解决了这个问题,但代码中没有任何变化。所以我所做的是重写bq查询句子,如:bq query --destination_table = .. - use_legacy_sql = false --replace'QUERY'而不是将查询分配给变量,然后使用echo |来执行它。 bq查询句子..
谢谢