在bigquery的bq命令行工具中转义引号字符以进行查询

问题描述 投票:0回答:3

我也尝试使用 bq 命令行自动生成新的每日表

bq query \
  --destination_table=<destination> \
  --allow_large_results \
  --noflatten_results \
  '<query>'

如下所示。 问题在于sql查询中存在一堆单引号和双引号,并且bq命令行工具也是使用单引号来划分要执行的查询。

所以我知道问题是我必须转义引号,但我不知道该怎么做。 我尝试将查询中的单引号替换为“\'”(不带双引号),但这没有帮助,而且似乎是合乎逻辑的做法。 我认为有一些明显我没有做的事情,所以希望有人可以帮助我,而不需要做很多工作。

SELECT
  time,
  userId,
  deviceId,
  systemName,
  LEFT(systemVersion,3) AS systemVersionMajor,
  systemVersion AS systemVersionMinor,
  deviceModel,
  appVersion,
  country,
  city,
  firstRun,
  priorTimeSpentInApp,
  priorSessions,
  priorEvents,
  event_name,
  event_info,
  event_time,
  event_value,
  MAX(CASE WHEN user_attribute.Name = 'Gen_Total_Sessions' THEN FLOAT(user_attribute.Value) END) AS Gen_Total_Sessions.attr,
  MAX(CASE WHEN user_attribute.Name = 'Gen_Last_Achievement' THEN STRING(user_attribute.Value) END) AS Gen_Last_Achievement.attr,
  MAX(CASE WHEN event_parameters.Name = 'Gamemode' THEN STRING(event_parameters.Value) END) AS Gamemode.param,
  MAX(CASE WHEN event_parameters.Name = 'Player_Level' THEN FLOAT(event_parameters.Value) END) AS Player_Level.param,

FROM
  TABLE_QUERY([projectId:dataSet], "table_id CONTAINS 'table1' OR table_id CONTAINS 'table2' OR table_id CONTAINS 'table3'"),
WHERE
  event_name = 'Started'
GROUP BY
  time,
  userId,
  deviceId,
  systemName,
  systemVersionMajor,
  systemVersionMinor,
  deviceModel,
  appVersion,
  country,
  city,
  firstRun,
  priorTimeSpentInApp,
  priorSessions,
  priorEvents,
  event_name,
  event_info,
  event_time,
  event_value 

*** 添加了更多信息 我读过有关使用转义码的内容,并对它有一些了解,但我无法让它工作。 这是我尝试在命令行上运行的一个非常简单的示例:

bq query 'SELECT time, userId, event_name, event_time, FROM 
TABLE_QUERY([rhi-localytics-db:LEANPLUM_DATA], \"table_id CONTAINS \'table1\'
OR table_id CONTAINS \'table2\' OR table_id CONTAINS \'table3\' \" ), WHERE 
event_name = \'Error\' GROUP BY time, userId, event_time, event_value' 

这对我来说看起来不错,但是当我运行它时,bash 会显示“-bash:意外标记 `)' 附近的语法错误”

但我不明白为什么。 我将传递给 bq 的外层单引号保留为未转义,并且我已转义了内部的每个单引号。 看来 bash 可能不会在不处理转义码本身的情况下传输引号..?

escaping google-bigquery
3个回答
7
投票

你应该使用转义字符\,如下所示

select 'ab\"c\'123'

阅读 https://cloud.google.com/bigquery/query-reference#stringfunctions

下的“转义字符串中的特殊字符”部分

3
投票

我认为你的问题是 bash 不允许你转义单引号内的引号。双引号允许您进行奇特的转义和替换,但单引号可以准确地给出您输入的内容,直到下一个单引号字符。

请参阅此处了解更多信息:如何转义单引号字符串中的单引号?

您有多种选择来处理此问题:

  • 使用上面链接中的引用策略之一
  • 在查询字符串中根据需要切换到双引号并转义
  • 将原始查询文本放入文件中,然后使用
    bq query "$(< myquery.txt)"
  • 吞入文件中
  • 使用 https://bigquery.cloud.google.com/ 上的 Web UI,它支持选项面板中所需的所有选项

0
投票

或使用此处文档:

bq query <<HERE
... your query
HERE

有一个问题:查询中的反引号必须转义,如果您明确命名 GCP 项目,则通常需要转义反引号。 (项目名称不能包含 _,所以人们经常使用 - 这是一个 SQL 元字符。)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.