替换 bq SQL 中的撇号或引号

Posted

技术标签:

【中文标题】替换 bq SQL 中的撇号或引号【英文标题】:Replacing apostrophe or quotes in bq SQL 【发布时间】:2013-08-28 04:56:45 【问题描述】:

我不熟悉使用 bq,Big Query 命令行实用程序。我有一个更复杂的 SQL 子句,不幸的是在 SQL 语句中同时包含撇号和引号字符。由于这两个字符都在 SQL 语句中,我正在寻找它们的替代品,否则其中一个或另一个将被解释为“查询结束”分隔符。

下面是我尝试运行的查询,它在 Big Query html 界面上运行良好,但在使用 bq 命令行实用程序时效果不佳。关于替换撇号或引号以使此东西运行的建议?是否有任何选项可以将文件内容传递给 bq 查询命令,以便可以将复杂查询存储在文件中? (也更容易在文件中阅读而不是挤在一行上)。

bq query 'SELECT regexp_extract(meta, r'\"bldid\":\"(.*?)\"') as bldid FROM stuff.201308010000 LIMIT 10'

[编辑] 在玩了更多之后,看起来这是一个简单的修复。如果 BEG 和 END 分隔符使用引号,则查询有效。

bq 查询 "SELECT regexp_extract(meta, r'\"bldid\":\"(.*?)\"') as bldid FROM stuff.201308010000 LIMIT 10"

不知道为什么这不适用于撇号来标记查询的开始和结束。

【问题讨论】:

【参考方案1】:

这是一个 bash 问题,而不是 BigQuery 问题:单引号在单引号字符串中是“不可引用的”。 Bash 在 BigQuery 看到之前处理字符串。

看看How to escape single-quotes within single-quoted strings?。

“用单引号括起来的字符会保留引号内每个字符的字面值。单引号不能出现在单引号之间,即使前面有反斜杠也是如此。” http://www.gnu.org/software/bash/manual/bashref.html#Single-Quotes

【讨论】:

解决方法可能是将您的查询创建为环境变量。 这更像是一个 BASH 问题而不是 Big Query。我的一位同事建议在文件上使用“cat”将 cat 的输出重定向到 bq 命令行。这工作得很好,而且更干净。现在我们可以将格式化的查询保存在一个文件中,并在命令行中使用文件名。 示例 - bq query "`cat foobar.sql`" 其中 foobar 包含复杂的 SQL 字符串。【参考方案2】:

尝试只使用双引号,但将它们转义。您还需要再转义 \ 一次:

bq query "SELECT regexp_extract(meta, r\"\\\"bldid\\\":\\\"(.*?)\\\"\") as bldid FROM stuff.201308010000 LIMIT 10;"

【讨论】:

以上是关于替换 bq SQL 中的撇号或引号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格

任何允许 Pivot 中的撇号 SQL 列别名的安全问题?

如何用撇号替换字符串中的双引号(不是指定它是字符串的外部双引号)

如何在 JSP 上转义撇号或引号(由 JavaScript 使用)

如何插入包含撇号(单引号)的值?

忽略包含中的撇号