sql拆分查询

有这样一个需求:

临时表sql:

create table #AA
(
   ID int,
   Name nvarchar(20)
)

insert #AA
select 1,'苏州/上海/温州'
union all
select 2,'南京'
union all
select 3,'北京/连云港'

方法:

 1 with hh as
 2  (select ID,
 3  Name=cast(left(Name,charindex('/',Name+'/')-1) as nvarchar(100)),
 4  Split=cast(stuff(Name+'/',1,charindex('/',Name+','),'') as nvarchar(100)) 
 5  from (SELECT ID,Name FROM #AA) t
 6  union all
 7  select ID,
 8  Name=cast(left(Split,charindex('/',Split)-1) as nvarchar(100)),
 9  Split= cast(stuff(Split,1,charindex('/',Split),'') as nvarchar(100)) from hh where split>'')
10 
11  select ID,Name from hh group by ID,Name
View Code

 感觉这个查询还是比较复杂的,下面就这个查询中用到的知识点做一个梳理。

1.charindex函数:返回字符或字符串在另一个字符串中开始的位置,如下所示:

如果找不到则返回0,自己可以试一下。

2.left函数

取一个字符串的前若干位,如下:

right函数是同样的道理,只是方向不同。

3.cast方法,转换类型的方法之一,如下:

上面也演示了convert转换的方法。

 4 with as的用法,请参看另一个练习示例。

5.stuff方法

学习链接:http://www.cnblogs.com/345563452/archive/2009/10/29/1592048.html

该方法的作用:删除指定长度的字符串,并在指定的起点插入另一组字符。这个方法的参数比较多,有4个,所以看起来比较费劲。如下:

 里面的参数有必要说明一下:

2表示删除的起始位置;3表示删除的长度;‘123’表示要插入的字符串

片段分析:

 我的版本:
 1 with hhh as
 2 (
 3 select ID,
 4 Name=cast(left(Name,charindex('/',Name+'/')-1) as nvarchar(100)),
 5 Split=SUBSTRING(Name,charindex('/',Name)+1,LEN(Name)-charindex('/',Name))
 6 from (SELECT ID,Name FROM #AA) t
 7 union all
 8 select ID,
 9 Name=cast(left(Split,charindex('/',Split+'/')-1) as nvarchar(100)),
10 Split=(case when charindex('/',Split)>0 then 
11 SUBSTRING(Split,charindex('/',Split)+1,LEN(Split)-charindex('/',Split))
12 else '' end)
13 from hhh where split>''
14 )
15 select ID,Name from hhh group by ID,Name
View Code

 

 

转载于:https://www.cnblogs.com/hshuai/p/3947363.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Hive SQL中,我们可以利用各种函数来进行字符串的切割或者拆分操作,这些函数通常用于在数据处理过程中根据特定字符或者模式将一个大的文本分割成更小的部分。以下是几个常用的字符串拆分函数及其用途示例: ### 1. `split()` `split()` 函数是一个通用的函数,用于按指定的分隔符将字符串拆分成数组。 **语法**: ```sql split(str, delimiter) ``` **例子**: 假设我们有一个包含姓名和年龄的逗号分隔的字符串列表: ```sql select split('张三,25,李四,30', ',') as names_and_ages; ``` 这将返回结果: ```sql [张三, 25, 李四, 30] ``` ### 2. `substring_index()` 和 `substring()` 结合使用 `substring_index()` 可以配合 `substring()` 使用,来实现复杂的字符串提取和拆分需求。 **组合使用**: 例如,如果我们要从前面提取出姓名部分,可以先使用 `substring()` 提取出可能包含姓名的部分,然后使用 `substring_index()` 对剩余的部分进行进一步处理。 ```sql with data as ( select '张三,25' as name_age from dual union all select '李四,30' as name_age from dual ) select name_age, substring(name_age, 1, locate(',', name_age)-1) as first_name, substring(substring_index(name_age, ',', -1), 1, length(name_age)) as age from data; ``` 这个查询将返回: ```sql name_age | first_name | age ----------------|-----------------|----- 张三,25 | 张三 | 25 李四,30 | 李四 | 30 ``` ### 3. `regexp_split_to_array()` 对于正则表达式的需求,`regexp_split_to_array()` 是一个非常有用的函数。 **语法**: ```sql regexp_split_to_array(string_expression, pattern) ``` **例子**: 如果我们有一个由多个名字组成的字符串,并且每个名字后面跟着一个空格和数字表示该名字的长度,那么我们可以使用 `regexp_split_to_array` 加上正则表达式来提取名称和它们对应的长度。 ```sql with data as ( select '张三4 李四6 王五2' as names_lengths from dual ) select * from unnest(regexp_split_to_array(data.names_lengths, r'\s+(\d+)')) as name_length(name, length); ``` 这将返回: ```sql name | length -------|-------- 张三 | 4 李四 | 6 王五 | 2 ``` 以上就是Hive SQL中几种常用的字符串拆分功能。每个函数都有其特定的应用场景,选择合适的函数取决于具体的业务需求和数据特征。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值