【问题标题】:Big query standard vs legacy syntax大查询标准与旧语法
【发布时间】:2018-09-01 10:16:23
【问题描述】:

以下函数在 sql legacy 上完美运行,但在 sql 标准上失败并出现错误:

“参数类型的函数 REGEXP_EXTRACT 没有匹配的签名:ARRAY、STRING。支持的签名:REGEXP_EXTRACT(STRING, STRING); REGEXP_EXTRACT(BYTES, BYTES)”

 regexp_extract(split(something,','), r'^(.*?)\:')

我尝试将 ' 替换为 ".. 没有成功。 有什么想法吗?

【问题讨论】:

  • split 给出了一个不受支持的数组。你想达到什么目的?
  • 我有一个 json 列,如下所示 {"X":2,"Y:1} 我想要实现的是不同行中的每个键和值:第 1 行 [ x | 2],第 2 行 [Y | 1]

标签: regex split google-bigquery bigquery-standard-sql


【解决方案1】:

除了使用splitregexp_extract,您还可以在JS 中放入一个UDF,以便您轻松解析:

CREATE TEMPORARY FUNCTION parse(json STRING) RETURNS ARRAY<STRING>
  LANGUAGE js AS """
        p = JSON.parse(json);
        arr = [];
        for (var key in p) {
          if (p.hasOwnProperty(key)) {
            arr.push(key + "|" + p[key]);
          }
        }
        return arr;""";
WITH foo AS (SELECT '''{"X":"2","Y":"1"}''' AS something)

SELECT parsed FROM foo, UNNEST(parse(something)) AS parsed

--

Row parsed  
1   X|2
2   Y|1

但是,它更多的是代码/SQL,并且对于您需要的东西可能有点矫枉过正。我只是想给你另一个选择,因为我不是使用正则表达式的忠实粉丝!

【讨论】:

    【解决方案2】:

    您需要使用ARRAY 函数作为从SPLIT 返回的元素的for-each 循环。例如,

    SELECT
      ARRAY(
        SELECT regexp_extract(x, r'^(.*?)\:')
        FROM UNNEST(split(something,',')) AS x
      ) AS result
    FROM table
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2016-08-30
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多