【问题标题】:Replacing apostrophe or quotes in bq SQL替换 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"

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

【问题讨论】:

    标签: google-bigquery


    【解决方案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;"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多