对于参数类型STRING和{ARRAY <STRING>}(Google BigQuery),运算符IN没有匹配的签名

Pun*_*der 4 ruby google-bigquery

我正在使用Google BigQuery Ruby Client v0.23并尝试使用参数化查询.我正在关注API文档以供参考.

当我在没有参数的情况下运行查询时,一切都很好.然而,为了使它们动态,当我使用数组参数时,我得到错误.例如,当我运行此查询时

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'] })
Run Code Online (Sandbox Code Playgroud)

我明白了

#<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'
Run Code Online (Sandbox Code Playgroud)

任何见解将不胜感激.

qua*_*zmo 7

我相信数组只是一个不正确的参数.根据Functions&Operators,语法是:

x IN (y, z, ...)
Run Code Online (Sandbox Code Playgroud)

请注意,没有数组.

用单个字符串替换数组有效:

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}]
Run Code Online (Sandbox Code Playgroud)

根据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}]
Run Code Online (Sandbox Code Playgroud)