我正在使用Google BigQuery Ruby Client v0.23并尝试使用参数化查询。我正在关注API docs以供参考。
当我在没有参数的情况下运行查询时,一切都很好。然而,为了使它们动态,当我使用数组参数时,我得到错误。例如。当我运行此查询时
bigquery.query("SELECT COUNT(*) FROM oven.sensor_counts WHERE _PARTITIONTIME = TIMESTAMP('2016-04-04') AND sensor_id IN (@sensor_ids)", params: { sensor_ids: ['48-6', '48-2'] })
我明白了
#<Harley::Response POST https://www.googleapis.com/bigquery/v2/projects/sensors-160421/queries == 400 (413 bytes) 3458ms>
Caught error invalidQuery: No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} at [1:116]
Error - #<Google::Apis::ClientError: invalidQuery: No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} at [1:116]>
Google::Cloud::InvalidArgumentError: invalidQuery: No matching signature for operator IN for argument types STRING and {ARRAY<STRING>} at [1:116]
from /usr/local/var/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/google-cloud-bigquery-0.23.0/lib/google/cloud/bigquery/service.rb:662:in `rescue in execute'
非常感谢任何见解。
答案 0 :(得分:5)
我认为数组只是一个不正确的参数。根据{{3}},语法为:
x IN (y, z, ...)
请注意,没有数组。
用一个字符串替换数组有效:
require "google/cloud/bigquery"
bigquery = Google::Cloud::Bigquery.new
sql = "SELECT word, SUM(word_count) AS word_count " \
"FROM `bigquery-public-data.samples.shakespeare`" \
"WHERE word IN (@words) GROUP BY word"
data = bigquery.query sql, params: { words: 'you' }
#=> [{"word"=>"you", "word_count"=>12527}]
根据上面链接的语法指南,数组参数可以添加UNNEST
:
UNNEST表单在FROM子句中处理类似UNNEST的数组扫描:
x [NOT] IN UNNEST(<array expression>)
此表单通常与ARRAY参数一起使用。例如:
x IN UNNEST(@array_parameter)
所以解决方案是:
require "google/cloud/bigquery"
bigquery = Google::Cloud::Bigquery.new
sql = "SELECT word, SUM(word_count) AS word_count " \
"FROM `bigquery-public-data.samples.shakespeare`" \
"WHERE word IN UNNEST(@words) GROUP BY word"
data = bigquery.query sql, params: { words: ['me', 'I', 'you'] }
#=> [{"word"=>"I", "word_count"=>21028}, {"word"=>"me", "word_count"=>8030}, {"word"=>"you", "word_count"=>12527}]
答案 1 :(得分:0)
还有一种更好的方法,可以使用数组using parameterized approach
从google.cloud导入bigquery
client = bigquery.Client()
sql =“从烤箱。传感器计数中选择COUNT(*)WHERE _PARTITIONTIME = TIMESTAMP('2016-04-04')AND sensor_id IN UNNEST(@sensor_ids)“
query_params = [ bigquery.ArrayQueryParameter(“ sensor_ids”,“ STRING”,['48 -6','48 -2']),]
job_config = bigquery.QueryJobConfig()job_config.query_parameters = query_params query_job = client.query( 查询, job_config = job_config,)client.query(sql,job_config = query_config)