REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

3,参数解释

  1. __srcstr :需要进行正则处理的字符串
  2. __pattern :进行匹配的正则表达式
  3. __position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
  4. __occurrence :标识第几个匹配组,默认为1
  5. __modifier :模式('i’不区分大小写进行检索;‘c’区分大小写进行检索。默认为’c’。)

4,测试SQL

select regexp_substr('1,2,3','[^,]+',1,1) result from dual;

运行结果:

5,REGEXP_SUBSTR+CONNECT BY 使用

按分隔符拆分字符串+CONNECT BY 动态参数
测试SQL:

SELECT 
REGEXP_SUBSTR ('1,2,3,4,5', '[^,]+', 1,ROWNUM) 
FROM dual 
CONNECT BY ROWNUM <= LENGTH( '1,2,3,4,5' ) - LENGTH(regexp_replace('1,2,3,4,5', ',', '' )) + 1

运行结果:

二、hive数据库按分隔符拆分字符串

1,split()函数

(1)定义

split()函数是用于切分数据,也就是将一串字符串切割成了一个数组

(2)语法

语法:split(string str, string pat)
返回值:数组类型array

(3)参数解释

string str :待分割字符串
string pat:分割符

(4)测试

测试SQL:

select split ('wo,shi,xiao,ming',',');

运行结果:

["wo","shi","xiao","ming"]

2,explode函数

(1)定义

explode()函数是用于打散行的函数,将一行的数据拆分成一列

(2)语法

explode(array/map类型)
select explode(array_col) as new_col from table_name

(3)测试

测试SQL:

select explode(array("wo","shi","xiao","ming")) as word;

运行结果:

(4)explode函数的局限性

  1. 不能关联原有的表中的其他字段
  2. 不能与group by、cluster by、distribute by、sort by联用
  3. 不能进行UDTF嵌套
  4. 参数只能是两种类型
  5. 一个select后面只能获得一个explode产生的视图,如果要显示多个列,则需要将多个视图合并。lateral view就是做这样的事的

3,lateral view

(1)定义

Lateral View用于和UDTF函数(explode、split)结合来使用
首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚拟表。虚拟表相当于再和主表关联, 从而达到添加“UDTF生成的字段“以外字段的目的, 即主表里的字段或者主表运算后的字段。
主要解决在select使用UDTF做查询过程中,查询只能包含单个UDTF,不能包含其他字段、以及多个UDTF的问题

(2)语法

lateral view UDTF(expression) table_view as new_column;

(3)参数解释

  1. UDTF(expression):复合逻辑规则的UDTF函数,最常用的explode
  2. table_view : 对应的虚拟表的表名
  3. new_col: 虚拟表里存放的有效字段

(4)测试

select col_type   -- 已拆分数据
from table_name
lateral view explode(split(col,',')) t as col_type   --col 为需要拆分的字段
				
代码如下:eclare @str nvarchar(50);set @str=’462,464,2′;select @str as ‘字符串’select len(@str) as ‘字符长度’select charindex(‘,’,@str,1) as ‘第一个逗号的索引值’select LEFT(@str,charindex(‘,’,@str,1)-1) as ‘第一个值’select SUBSTRING(@str,charindex(‘,’,@str,1)+1,len(@str)) as ‘从第一逗号开始截取出后面的字符串’select LEFT(SUBSTRING(@str,char
1、sql创建函数 CREATE FUNCTION [dbo].[fn_split](@p_str NVARCHAR(MAX), @p_split NVARCHAR(20)) RETURNS @tab TABLE(tid NVARCHAR(2000)) BEGIN DECLARE @idx INT DECLARE @len INT SELECT @len = LEN(@p_split), @idx = CHARINDEX(@p_split, @p_str, 1) WHILE(@idx >= 1)
一、概述: MSSQL字符串拆分没有封装太多常用的方式,所以如果向数据库插入用特殊字符分割字符串(比如CB0$CB2$CB3,CB0$CB2$CB3)时就可能需要数据库能够分割字符串SQL拆分字符串的常用方法有 1、len(@strname) :查询字符串的长度 2、charindex('$',@strname,1) :查询特殊字符存在的位置index 3、substring(@s...
SQL分割字符串函数SQL里类似Split的分割字符串函数 SQL字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。 一.用临时表作为数组 str:需要拆分字符串; delim:分隔符,根据此字符来拆分字符串; count:当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n 个分隔符之后的所有字符 – 》str=’ 金融业企业-银行业存款类金融机构-国家开发银行及政策性银行’ –> 1 substring_index(str,’-’,1) –>得到 金融业企业 由于是取第一个 - 之前的所有字符 --方法一 SELECT d.dept_name,wm_concat(e.emp_name) FROM employee e INNER JOIN department d ON d.dept_id=e.dept_id GROUP BY d.dept_name; 执行结果: DECLARE @id VARCHAR(200) DECLARE @idlist VARCHAR(500) = '1,2,3,5,6,8,9,10,11,12,14,15,16,17,18,19,20' WHILE LEN(@idlist) > 0 BEGIN IF CHARINDEX(',',@idlist) > 0 SET @id = SUBSTRING(@idlist,0,CHARINDEX(',',@idlist)) BEGIN
SQL分割字符串详解 T-SQL字符串的处理能力比较弱,比如我要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦。下边的函数,实现了象数组一样去处理字符串。 一,用临时表作为数组。
SQL Server 可以使用内置函数 `PARSE` 或者 `STRING_SPLIT` 来实现分隔字符串。 例如,要将字符串 "A,B,C,D" 按照 "," 进行分隔,可以使用以下代码: SELECT value FROM STRING_SPLIT('A,B,C,D', ',') 也可以使用 `PARSE` 函数,例如: DECLARE @str nvarchar(50) = 'A,B,C,D'; WITH split (start, [end], value) AS SELECT 1, CHARINDEX(',', @str), SUBSTRING(@str, 1, CHARINDEX(',', @str) - 1) UNION ALL SELECT [end] + 1, CHARINDEX(',', @str, [end] + 1), SUBSTRING(@str, [end] + 1, CHARINDEX(',', @str, [end] + 1) - [end] - 1) FROM split WHERE [end] > 0 SELECT value FROM split; 这两种方法都可以用来分隔字符串,您可以根据实际情况选择使用。