使用bq命令执行BQ查询时查询导致问题的情况

时间:2018-03-18 04:26:46

标签: google-bigquery

我尝试使用 Shirt = 10$ pants = 20$ shoes = 60$ hat = 10$ socks = 5$ 命令通过bash执行查询。查询在通过Web UI以及应用脚本@ script.google.com执行时有效。但是,当作为简单的bash(或仅通过cmd提示符)执行时,我会一直收到bq。 Col 393指的是陈述时的案件的中间部分。我已经做了很多搜索,无法弄清楚我做错了什么(因为查询在别处工作)。有人可能会对导致错误的原因提出建议吗?

"Syntax error: Unexpected keyword THEN at [1:393]"

非常感谢你的帮助。 Brian P

3 个答案:

答案 0 :(得分:1)

这里的问题是由于在查询中使用相同的单引号引起的,这些引号与包装整个查询的引号相同。

您的选择:

  1. 转义查询when freq = \'1\' then \'a\'
  2. 中的所有引号
  3. 将引号更改为双引号when freq = "1" then "a"
  4. 通过文件将查询传递给bq query命令。 cat your_query.sql | bq query
  5. 选项3 :是最优雅的解决方案,也有助于以一种很好的方式组织代码,将SQL保持为SQL,而不是直接在bash代码中嵌入大量SQL。您不需要对当前SQL进行任何更改。

    完整示例看起来像

    cat your_query.sql | bq query \
      --destination_table abcdefcloud:ds_tables.daily_over_frequency_output \
      --replace \
      --use_legacy_sql=false 
    

    your_query.sql包含的位置:

    with freq as
    (select month as month,campaign_id,campaign,case when  freq = '1' then 'a'
     when freq = '2' then 'b'
     when freq = '3-6' then 'c'
     when freq = '7-9' then 'd'
     when freq = '10-19' then 'e'
     when freq = '20-29' then 'f'
     when freq = '30-39' then 'g'
     when freq = '40-49' then 'h'
     when freq = '50-59' then 'i'
     when freq = '60-69' then 'j'
     when freq = '70-79' then 'k'
     when freq = '80-89' then 'l'
     when freq = '90-99' then 'm'
     when freq = '100+' then 'n'
     else 'other' end as sort,
     freq,sum(imps) as imps,sum(uu) as uu from...
    

答案 1 :(得分:0)

假设freq列是数字(可能应该是),那么CASE表达式应该失败,因为3-6不是有效数字。请尝试使用此版本:

case
    when freq = 1 then 'a'
    when freq = 2 then 'b'
    when freq between 3 and 6 then 'c'
    when freq between 7 and 9 then 'd'
    when freq between 10 and 19 then 'e'
    when freq between 20 and 29 then 'f'
    ...
    when freq > 100 then 'n'
    else 'other' end as sort

答案 2 :(得分:0)

我认为这是你的问题:

freq = '1' then 'a'

如果仔细查看引号,您会发现它们与引用查询的类型相同:)这最终会被评估为:

freq = then

......我认为不是你想要的。如果您使用双引号,它应该“正常工作”,减去查询中的任何语义错误。