在 bigquery 的 bq 命令行工具中转义查询的引号字符
Escaping quote characters for query in bigquery's bq command line tool
我也在尝试使用 bq 命令行自动生成新的每日 table
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 在不处理转义码本身的情况下不会传输引号..?
你应该像下面那样使用转义字符 \
select 'ab\"c\'123'
阅读 https://cloud.google.com/bigquery/query-reference#stringfunctions
下的 "Escaping special characters in strings" 部分
我认为你的问题是 bash 不允许你在单引号内转义引号。双引号允许您进行花哨的转义和替换,但单引号可以准确地给出您键入的内容,直到下一个单引号字符。
更多信息请看这里:How to escape single-quotes within single-quoted strings?
你有几个选项来处理这个问题:
- 使用上述 link 中的一种引用策略
- 在查询字符串中根据需要切换到双引号和转义
- 将您的原始查询文本放入一个文件中,然后在文件中输入
bq query "$(< myquery.txt)"
- 在 https://bigquery.cloud.google.com/ 使用网络 UI,它支持您在选项面板中需要的所有选项
我也在尝试使用 bq 命令行自动生成新的每日 table
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 在不处理转义码本身的情况下不会传输引号..?
你应该像下面那样使用转义字符 \
select 'ab\"c\'123'
阅读 https://cloud.google.com/bigquery/query-reference#stringfunctions
下的 "Escaping special characters in strings" 部分我认为你的问题是 bash 不允许你在单引号内转义引号。双引号允许您进行花哨的转义和替换,但单引号可以准确地给出您键入的内容,直到下一个单引号字符。
更多信息请看这里:How to escape single-quotes within single-quoted strings?
你有几个选项来处理这个问题:
- 使用上述 link 中的一种引用策略
- 在查询字符串中根据需要切换到双引号和转义
- 将您的原始查询文本放入一个文件中,然后在文件中输入
bq query "$(< myquery.txt)"
- 在 https://bigquery.cloud.google.com/ 使用网络 UI,它支持您在选项面板中需要的所有选项