1

datalab github 存储库(位于 datalab/tutorials/BigQuery/ 下)的“SQL 参数”IPython 笔记本中的参数化示例显示了如何更改在 WHERE 子句中测试的值。

%%sql --module get_data
SELECT *
FROM
    [myproject:mydataset.mytable]
WHERE
    $query

但是,这种语法似乎总是在参数周围插入引号。当我传递不仅仅是一个简单值的参数时,这会中断:

import gcp.bigquery as bq
query = "(bnf_code LIKE '1202%') OR (bnf_code LIKE '1203%')"
query = bq.Query(get_data, query=query)

print query.sql

这将打印一个无效的查询:

SELECT * FROM [myproject:mydataset.mytable]
WHERE "(bnf_code LIKE '1202%') OR (bnf_code LIKE '1203%')"

有什么方法可以插入未用引号括起来的值?

我在我的代码中重复使用该模块,在查询参数中使用可变数量的 OR 子句。所以我确实需要一种方法来传递更复杂的查询。

4

2 回答 2

3

抱歉,变量应该是简单的标量、表或(很快)用于 IN 子句的列表。它们不是用来表达的。

于 2015-12-15T20:41:14.083 回答
2

将不带引号的参数传递给 SQL模块是不可能的,但可以创建一个datalabs.data.SQLStatement字符串形式的直接 SQL。有了它,您可以使用自己的 Python 风格的占位符来替换您认为合适的值:

import datalab.data._sql_statement as bqsql
statement = bqsql.SqlStatement(
    "SELECT some-field FROM %s" % '[your-instance:some-table-name]')
query = bq.Query(statement)

我不知道他们是否对占位符或笔记本中的命令处理做了什么特别的事情,但是......好吧,我在我的(诚然有限的)探索中没有看到任何这些。

于 2016-08-23T21:03:58.500 回答