大查询标准与传统语法

时间:2018-09-01 10:16:24

标签: regex split google-bigquery standard-sql

以下功能在sql传统上可以正常使用,但是在sql标准上失败,并显示错误:

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

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

我试图用'。替换'。没有成功。 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

除了使用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,对于您所需的内容可能有些过大。我只是想给您另一个选择,因为我不喜欢使用正则表达式!

答案 1 :(得分:0)

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

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