0

我试图使用javascript函数测试我是否可以从查询中操作数据表单中的数据,但编译器说“颜色”未定义(我试图操作的其中一个字段),我还没有找到任何关于如何使用函数的示例,只看到了带有js常量的示例,但没有看到数据操作,下面是我的尝试方式(请注意,当我在查询SELECT上调用函数“addcolor”时):

配置{类型:“视图”,名称:“available_bicycles_dataform”}选择ab.bicycle编号,ab.制造商,ab.颜色为颜色,${addcolor(color)}作为added_color发件人`学习-项目.自行车.可用_自行车`AS abLEFT连接`学习项目.bicycles_scheduled.scheduled_job_used_bickles`AS abdf打开ab.bicycle_id=abdf.bike_id哪里abdf.bike_id为空js型{函数addcolor(color){返回颜色+“hi”;}}

编辑:

添加一个我期望发生或试图实现的事情的示例:

假设我在可用自行车表:

自行车id 制造商 颜色
1 ACME公司 蓝色
2 ACME公司 红色
ACME公司 绿色

当运行创建视图的查询时,我希望dataform做什么可用自行车数据表是添加一个新列,该列是用javascript函数“操纵”的列:

自行车id 制造商 颜色 添加的颜色
1 ACME公司 蓝色 布鲁希
2 ACME公司 红色 雷迪
ACME公司 绿色 格林希

注意,新的addedcolor列在颜色后面附加了“hi”

1答案1

重置为默认值
0

我对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语句,但执行当运行这些语句时。

6
  • 嘿,谢谢你的回答,所以如果我执行它,它应该可以工作(因为控制台编译器错误,还没有尝试过)?或者如果您知道使用js转换查询字段的正确方法,我很感激 评论 4月21日20:22
  • 你还没有描述你想要实现什么。。。只是有一个编译错误。所以我无法回应“它应该有效”。如果您想在运行时使用JavaScript执行数据值的转换,那么正确的方法是创建一个用JS编码的UDF并调用该UDF。Dataform用于描述您想要执行的SQL,并在将其提交给BigQuery执行时,对SQL的语义处理没有任何说明/添加。
    – 科尔班
    评论 4月21日21:14
  • 也许我不是很清楚,只是添加了一个编辑,我想用它实现什么 评论 4月21日22:10
  • 我已经根据你的编辑用更多的文字更新了原始答案。
    – 科尔班
    评论 4月21日22:29
  • 好的,我知道可以用你提到的方法得到想要的结果,但是如果我需要使用js函数来获得相同的结果,那该怎么做呢? 评论 4月21日22:38

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.