细节:sql 中有涉及到正则匹配函数的,要注意转义符号
因为在不同语言下正则匹配规则是否需要加转义符号是不同的,举例,regexp_replace 函数,在hive sql的正则匹配规则的 d+ 需要前面给它加上转义符号,而在java中可能不用,在Presto sql 就是不用加转义符号的。
☺ 思路:不用特意去记哪一种语言需要加转义符号,哪种语言不需要,只需要记住正则匹配规则,报错的一个原因,可能是转义符号的问题即可。
(1) 语法:get_json_object(string json_string, string path)
- json_string:必填。STRING类型。标准的JSON格式对象,格式为。如果遇到英文双引号("),需要用两个反斜杠()进行转义。如果遇到英文单引号('),需要用一个反斜杠()进行转义。
- path:必填。STRING类型。以$开头。
- :表示根节点。
- 或:表示子节点。MaxCompute支持用这两种字符解析JSON对象,当JSON的Key本身包含时,可以用来替代。
- :表示数组下标,从0开始。
- :返回整个数组。不支持转义。
(2) 例子:
(1) 符合正则表达式方式,截取字符串 regexp_extract
- 语法:regexp_extract(string subject, string pattern, int index)
- 抽取字符串subject 中符合正则表达式pattern 的第index 个部分的子字符串
index是返回结果取表达式的哪一部分
- 0 表示把整个正则表达式对应的结果全部返回
- 1 表示返回正则表达式中第一个()对应的结果,以此类推。
(2) 按字符位置截取字符串 substr
- 语法:substr(string|binary A, int start) substr(string|binary A, int start, int len)
(1) 语法:
regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)
(2) 作用:
按照正则表达式pattern 将字符串INTIAL_STRING 中符合条件的部分替换成REPLACEMENT 指定的字符串
(3) 例子:
(1) concat 拼接字符串
- 语法:concat_ws(字符串1,字符串2)
(2) concat_ws 带分割符的拼接字符串
- 语法:concat_ws(‘分隔符’,字符串1,字符串2)
(1) 规定时间输出格式 date_format
细节:date_format 无法识别/的时间格式,例如:select date_format(‘2023/01/17’, ‘y’); 结果是null
解决:先通过字符串替换函数,将/ 替换成 -,然后再使用date_format 函数,获取指定格式的时间
(2) 和时间戳相关
unix_timestamp(string date) 获取当前时间戳
- unix_timestamp(string timestame) 输入的时间戳格式必须为’yyyy-MM-dd HH:mm:ss’,如不符合则返回null
unix_timestamp(string date, string pattern) 指定格式将时间字符串转化成时间戳
- select unix timestamp(‘2023-1-6’‘yyyy-MM-dd’);
from_unixtime(bigint unixtime[, string format]) 将时间戳转成国际协调时间
- 语法:ROW_NUMBER() OVER(PARTITION BY 分区的字段 ORDER BY 升序/降序字段 [DESC])
(1) 作用:
炸裂函数,实现将一行转换成多列,然后侧视图函数进行聚合
(2) 例子:
- 原数据结果:
- 试试炸裂函数explode 效果:
▷ explode(genre) 和其他字段一起查询
- 实际业务,字段game_name,genre 都要查询
报错:UDTF’s are not supported outside the SELECT clause, nor nested in expressions
分析:原因是因为这个字段genre,炸裂之后,转换成多列(3列),而game_name 字段依然是1列,列数不匹配
解决:侧视图(表)的聚合
聚合效果:
- 先将json转换成map,然后使用方法map_remove删除,最后使用map_values取出来
- nvl(valueExp1, valueExp2):根据第一个表达式的值是否为空,不为空则返回第一个表达式的值,若为空则返回第二个表达式的值
(1) 作用:
with as短语,也叫做子查询部分,是用来定义一个SQL片断,该SQL片断会被整个SQL语句所用到。其中,SQL片段产生的结果集保存在内存中,
后续的sql均可以访问这个结果集,作用与视图或临时表类似。
(2) 语法:
(3) 本质:
with…as 子查询部分,和直接用子查询效率上没有什么区别,只是这种写法增加了sql可读性。
(4) 小细节:
- with…as 特点:是一次性的,例如下面的例子,定义的"临时表"temp1,在第一次查询name 之后,就不可以再查看id了。
(1) 语法:
cast(expr as <type>) 将表达式 expr 的结果转换为 <type>
Cast(字段名 as 转换的类型)
(2) 例子:
-
举例1:cast(‘1’ as BIGINT) 将字符串 ‘1’ 转换为其整数表示形式
-
举例2:表tableA 有一个时间字段 release_time:2018-11-03 15:31:26
- 结果:release_time:2018-11-03