BigQuery中IF包裹带FROM的STRING_AGG报语法错误如何解决
报错产生原因
IF()是BigQuery的标量函数,仅支持传入能计算出单个值的表达式作为参数,不能直接在函数的参数括号里嵌入带FROM子句的查询片段。
你写的报错SQL里,IF的第二个参数只写了STRING_AGG(x, ' | ')就直接接了FROM UNNEST(...),语法解析器读到FROM关键字的时候,本来等着匹配右括号)结束当前参数,自然会抛出Syntax error: Expected ")" but got keyword FROM的错误。
去掉外层IF之后的代码能正常跑,是因为STRING_AGG加UNNEST本身就是合法的完整SELECT查询结构,不存在函数括号里嵌FROM的语法冲突。
正确SQL写法
把UNNEST数组展开+STRING_AGG聚合的逻辑包成一个标量子查询,整个子查询作为IF的参数传入就可以。子查询会先计算出聚合后的单个字符串值,完全符合IF函数的参数要求,参考代码:
SELECT IF( TRUE, -- 替换成你实际的业务判断条件,条件成立时返回聚合后的字符串 ( SELECT STRING_AGG(x, ' | ') FROM UNNEST([ IF(FALSE, 'new_customer', NULL), IF(TRUE, 'new_customer_vertical', NULL), IF(TRUE, 'new_customer_expedition', NULL), IF(FALSE, 'new_customer_pandapro', NULL) ]) AS x ), NULL -- 替换成条件不成立时要返回的默认值 ) AS merged_tags
这段代码执行后会正常返回结果:new_customer_vertical | new_customer_expedition。
补充:
STRING_AGG聚合时会自动跳过NULL值,如果你不需要在外层做独立的业务判断,只是想过滤掉不需要拼接的标签,直接在构造数组的阶段用IF控制返回NULL就够了,不需要额外套外层IF。
内容的提问来源于stack exchange,提问作者Lucas Dresl
相关产品推荐
相关产品推荐

