大查询标准与旧语法

Posted

技术标签:

【中文标题】大查询标准与旧语法【英文标题】: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] 【参考方案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

【讨论】:

这里是关于该主题的文档:cloud.google.com/bigquery/docs/reference/standard-sql/…

以上是关于大查询标准与旧语法的主要内容,如果未能解决你的问题,请参考以下文章

Mysql--DQL数据查询语言标准语法

C# 之 LINQ的查询语法

hql 语法详解

如何将oracle中的解码功能转换为标准大查询

2021年大数据Hive:Hive查询语法

在大查询中从宽到长重塑(标准 SQL)