sqloraclesubstr
⑴ sql中级进阶(三)hive的 collect_set 与oracle的wm_concat
Oracle的wm_concat用于多行合并为一行,原始版本使用逗号链接。例如:
(1)原始版本: 'aaa,bbb,ccc,ddd,eee'
修改版本使用'|'链接,例如:
(2)修改版本: 'aaa|bbb|ccc|ddd|eee'
(2)修改版本2: 'aaa|bbb|ccc|ddd|eee',并去重。
Oracle的SQL使用REGEXP_SUBSTR函数来一行拆分成多行。其格式为:
REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
参数说明如下:
- __srcstr:需要进行正则处理的字符串
- __pattern:进行匹配的正则表达式
- __position:起始位置,从第几个字符开始正则表达式匹配(默认为1)
- __occurrence:标识第几个匹配组,默认为1
- __modifier:模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
Hive的collect_set函数用于去重地将同一分组的不同行数据聚合成一个集合。例如,创建原数据表:
CREATE TABLE stud (name string, area string, course string, score int);
向原数据表插入数据:
INSERT INTO TABLE stud VALUES('zhang3','bj','math',88);
查询表中数据:
SELECT * FROM stud;
将同一分组的数据聚合成一个集合:
SELECT course, collect_set(area), avg(score) FROM stud GROUP BY course;
使用下标可以取某一个集合元素:
SELECT course, collect_set(area)[0], avg(score) FROM stud GROUP BY course;
通常,此过程的最终写法可以使用concat_ws函数连接集合中的元素,例如:
concat_ws(',', collect_set(area))
输出结果为:sh,bj
连接符号也可以改为其他字符,例如'|'。
总结:Oracle和Hive中wm_concat与collect_set、collect_list函数的主要功能相似,都是用于数据聚合处理。它们的不同在于语法和应用场景。这些函数在数据处理和分析中广泛使用,提供了有效的方法来管理多行数据。
⑵ sql数据库截取字符串函数
SQL截取字符串函数:
A.截取从字符串左边开始N个字符
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.xrss.cn'
Select Left(@S1,4)
------------------------------------
显示结果: http
B.截取从字符串右边开始N个字符(例如取字符www.163.com)
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.163.com'
Select right(@S1,11)
------------------------------------
显示结果: www.163.com
C.截取字符串中任意位置及长度(例如取字符www)
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.xrss.cn'
Select SUBSTRING(@S1,8,3)
------------------------------------
显示结果: www
以上例子皆是已知截取位置及长度,下面介绍未知位置的例子
2.截取未知位置的函数
A.截取指定字符串后的字符串(例如截取http://后面的字符串)
方法一:
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.xrss.cn'
Select Substring(@S1,CHARINDEX('www',@S1)+1,Len(@S1))
------------------------------------
显示结果: www.163.com
需要注意:CHARINDEX函数搜索字符串时,不区分大小写,因此CHARINDEX('www',@S1)也可以写成CHARINDEX('WWW',@S1)
方法二:(与方法一类似)
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.xrss.cn'
Select Substring(@S1,PATINDEX('%www%',@S1)+1,Len(@S1))
--此处也可以这样写:Select
Substring(@S1,PATINDEX('%//%',@S1)+2,Len(@S1))
------------------------------------
显示结果: www.163.com
函数PATINDEX与CHARINDEX区别在于:前者可以参数一些参数,增加查询的功能
方法三:
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.xrss.cn'
Select REPLACE(@S1,'http://','')
------------------------------------
显示结果: www.163.com
利用字符替换函数REPLACE,将除需要显示字符串外的字符替换为空
方法四:
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='http://www.xrss.cn'
Select
STUFF(@S1,CHARINDEX('http://',@S1),Len('http://'),'')
------------------------------------
显示结果: www.163.com
函数STUFF与REPLACE区别在于:前者可以指定替换范围,而后者则是全部范围内替换
B.截取指定字符后的字符串(例如截取C:\Windows\test.txt中文件名)
与A不同的是,当搜索对象不是一个时,利用上面的方法只能搜索到第一个位置
方法一:
以下是代码片段:
Declare @S1 varchar(100)
Select @S1='C:\Windows\test.txt'
select right(@S1,charindex('\',REVERSE(@S1))-1)
-------------------------------------
显示结果: text.txt
利用函数REVERSE获取需要截取的字符串长度