文章目录
前言:查看函数详细描述的SQL:
describe function extended func_name;
1. 内置函数(Built-in Functions)
1.1 字符串函数
下面重点解释上面红色函数:
-
字符串拼接
-
直接拼接:
concat(string + | array(string) +)
select concat("angela","baby"); -- 输出:"angelababy" -- 注意:只要有一个元素为null,则返回null select concat("angela","baby", null); -- 输出:null -- 注意:也可以传入集合 select concat(array("a", "b", "c"));
-
指定拼接符:
concat_ws(separator, [string | array(string)]+)
select concat_ws('.', 'www', array('baidu', 'com')); -- 输出:"www.baidu.com" -- 注意1:可以存在元素为null,它会先去掉null,再拼接。比如: select concat_ws("#", "123", "abc", null); -- 输出:”123#abc“ -- 注意2:全部元素为null时,返回的是空字符串'',而不是 null select concat_ws("#", null, null); -- 注意3:也可以传入集合 select concat_ws("#", array("a", "b", "c"));
-
推荐使用
concat_ws()函数
时,使用空字符串''
作为分隔符,因为会更加准确。会使得无用行只算一次,不要小看这一次,当concat_ws('',collection_nid_src,cuid)
,每个cuid会造成一条无效数据,如果有30万用户,使用''
与-
就会相差30万条数据。
当然最准确的做法是将脏数据提前过滤掉,比如:count(distinct case when collection_first='0' and collection_nid_src is not null and collection_nid_src != '' and cuid is not null and cuid != '' then concat_ws('-',collection_nid_src,cuid) end)
-
为什么使用空字符串做分隔更加准确:
- 使用
''
分隔:
- 使用
'-'
分隔:
- 使用
-
-
-
字符串切分
-
切分后是一个数组,可以通过下标访问元素:
split(str, regex | separator)
// 切分字符串 select split('apache hive', ' '); -- 输出:['apache', 'hive'] // 切分字符串并访问元素 select split('apache hive', ' ')[0]; -- 输出:'apache' // 注意:切分null,结果为null select split(null, ','), -- 输出:NULL size(null) -- 输出:-1
注意:当待切分的对象中没有分隔符时,整个对象对作为一个元素
// 比如 select split('ab', ','); -- 输出:['ab'] // 切分空字符串也是同理 select split('', ','); -- 输出:['']
-
切分并访问元素:
substring_index(要处理的字符串, 分隔符, num)
-- 1. num可以为正 select substring_index("www.baidu.com", '.', 1); -- 输出:www select substring_index("www.baidu.com", '.', 2); -- 输出:www.baidu select substring_index("www.baidu.com", '.', 3); -- 输出:www.baidu.com -- 2. num可以为负 select substring_index("www.baidu.com", '.', -1); -- 输出:com -- 3. 像数组用下标一样访问中间元素: 两个方向结合即可 select substring_index( substring_index("www.baidu.com", '.', 2)
-