1

我正在尝试确定是否有办法将参数传递给sqlRMarkdown 中连接到 BigQuery 的块:

```{r setup}
library(bigrquery)
bq_auth(path = "access_token.json")
db <- dbConnect(
  bigquery(), 
  dataset = 'my_data', 
  project = 'my-project', 
  use_legacy_sql = FALSE
)

parameter_value = 10L
```

```{sql, echo=FALSE, connection=db, output.var="x}
SELECT @parameter_value
```

```{r}
print(x)
# I want to see 10 here.
```

在此处查看 BigQuery 参数化查询文档 - https://cloud.google.com/bigquery/docs/parameterized-queries

更新 1

尽管?parameter_value注入似乎对标量有效,但它不适用于向量,例如:

  ```{r}
  parameter_value = c(10L, 20L)
  ```

  ```{sql, echo=FALSE, connection=db, output.var="x}
    SELECT UNNEST(?parameter_value)
  ```

将失败:

vapply(values, function(x) dbQuoteLiteral(conn, x), character(1)) 中的错误:值的长度必须为 1,但 FUN(X[ 1 ]) 结果的长度为 2

带有标量的事件不使用 BigQuery 引擎来参数化查询。

更新 2

我认为现在不可能做到这一点,因为一些DBI API没有在bigrquery包中实现,我已经提出了一个问题。并在这里knitr打包

4

3 回答 3

1

您可以使用?在 sql 块中插入 R 变量,请参阅在查询中使用 R 变量

    ```{sql connection=db,output.vars="x"}
    SELECT ?parameter_value
    ```
print(x)
<int>
10  
于 2020-06-22T10:23:51.397 回答
0

我不确定bigquery,但这适用于 PostgreSQL。您需要glue::glue_sql()传递一些参数。在这里讨论

```{r }
parameter_value <- c(10L, 20L)
parameter_value = glue::glue_sql("{parameter_value*}", .con = wcon)
```

```{sql, connection=wcon, output.var="x"}
select * from t
where t.price in (?parameter_value)
limit 10
```
于 2020-11-28T16:23:03.407 回答
0

只是为了澄清一下,您正在使用 r 块,对吗?根据这个例子是可能的。

```{r}
library(DBI)
db = dbConnect(RSQLite::SQLite(), dbname = "sql.sqlite")
```

```{sql, connection=db}
SELECT * FROM trials
```
于 2020-06-20T13:53:04.673 回答