我对Dataform和JavaScript的看法是,当SQLX被编译为纯SQL时,JavaScript是在编译时执行的。不要认为JS是在SQL语句的BigQuery执行期间执行的。考虑到这一点,我们查看您的SELECT语句,可以看到:
选择ab.bicycle编号,ab.制造商,ab.颜色为颜色,${addcolor(color)}作为added_color来自。。。
关注以下内容:
${addcolor(color)}作为added_color
我将其解释为。。。。
我们的目标是生成SQL。。。我们将使用SQL,其内容如下:
选择ab.bicycle编号,ab.制造商,ab.颜色为颜色,
现在我们遇到了${addcolor(颜色)}
。我们在这里要做的是调用一个名为添加颜色
它返回的内容将替换为SQL组件。因此,如果该函数返回“HelloWorld”,就好像我们编码了:
选择ab.bicycle编号,ab.制造商,ab.color作为颜色,你好世界来自。。。
因为您的JS函数c调用了添加颜色()
获取了一个参数,您提供的参数值为颜色
,在编译期间,编译器尝试将参数解析为名为颜色
但范围内没有这样的变量。这解释了您的错误消息:
“颜色”未定义
稍后。。。编辑后。。。
我们现在必须扪心自问,我们希望得到的SQL是什么样的。。。答案是:
选择ab.bicycle编号,ab.制造商,ab.颜色为颜色,CONCAT(ab.color,“hi”)作为added_color来自。。。
在这种情况下,不需要JS函数调用。
然而,如果您需要在JavaScript函数中执行逻辑,则需要创建一个命名的用户定义函数(UDF)。可以找到相关文档在这里。文档包含示例/示例,让人觉得很容易理解。。。然而,总而言之:
创建温度功能myJsFunc(输入)返回字符串语言jsAS r“”返回输入+“hi!”;"""
然后,SQL语句中的调用逻辑将变成:
选择ab.bicycle编号,ab.制造商,ab.颜色为颜色,myJsFunc(ab.color)AS新增颜色来自。。。
我想让你注意到的是,这个故事中没有任何内容需要Dataform。相反,UDF的定义本身就是一条SQL语句,而UDF的调用只是对先前定义的UDF的引用。Dataform为您提供的功能是管理所有这些SQL语句,但不在执行当运行这些语句时。