substr和substring函数截取字符串

本文详细介绍了SQL中使用substr和substring函数进行字符串截取的方法,包括正数和负数索引的使用,以及如何指定截取长度。通过具体示例展示了如何从字符串中截取出特定部分,适用于数据库操作和字符串处理的学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

substr函数或者substring函数:进行模糊查询或者进行截取字符串进行模糊匹配。

substr(string colname, int start), substring(string colname, int start) 两者用法一样两个参数

返回值: string

说明:返回字符串colname从start位置到结尾的字符串

示例:   

select substr('abc',2);
          bc
select substring('abc',2);
          bc
select substr('abc',-1); (负数从最后一位开始截取)
          c
select substr('abc',1) 或 selectsubstr('abc',0);(默认从第一位开始取)
          abc

substr(string colname, int start, int len), substring(string colname, intstart, int len),两者用法一样三个参数

         返回值: string

        说明:返回字符串colname从start位置开始,长度为len的字符串

示例:

select substr('abcefg',2,3);
              bce
 select substring('abcefg',2,3);
              bce
select substring('abcefg',-3,2);
              ef

 

<think>好的,用户想了解Hivesubstrsubstring函数的区别及用法。我需要先回忆一下这两个函数的具体语法差异。根据提供的引用资料,特别是引用34,substrsubstring的参数不同,截取方式也有差异。 首先,Hivesubstr函数语法是substr(str, start, length),其中start从1开始,这引用2中的示例一致。例如,substr('你好明天',1,3)返回“你好明”。而substring的语法是substring(str, start, end),其中startend的位置会影响截取结果,且end不包含在内,如substring(str, 0,3)在Hive中可能从0开始,但需要注意Hive是否支持0作为起始索引,因为引用2提到Hive中下标从1开始。 接下来要整理两者的参数区别:substr的第三个参数是长度,而substring的第三个参数是结束索引。需要注意HiveSpark在处理这些函数时的不同,如引用1提到两者在分组时使用这些函数可能有差异。例如,在Hive中,substr的起始位置是1,而Spark可能不同,但用户的问题主要集中在Hive上。 还要指出在Hive中使用这两个函数时可能出现的常见错误,比如起始位置是否从0或1开始,是否需要处理负数等情况。根据引用4,substr是取头取尾,substring是取头不取尾,因此结束索引不包含在内。 最后需要总结两者的使用场景,比如当知道需要截取的长度时用substr,当知道结束位置时用substring。同时提醒用户注意不同数据库系统的差异,虽然用户只问Hive,但扩展了解可能对以后有帮助。 现在要确保回答结构清晰,分点说明,并给出示例代码,如引用2中的Hive示例,并对比两者的语法结果。同时生成相关问题,如性能差异、优化方法等,引导用户深入思考。</think>### Hivesubstrsubstring函数对比 #### 一、核心区别 1. **参数定义** - `substr(str, start, length)`: 从`start`位置开始截取,**长度为`length`** 示例:`substr('你好明天',1,3)` → `'你好明'`[^2] - `substring(str, start, end)`: 从`start`位置截取到`end`位置(**不包含`end`索引字符**) 示例:`substring('你好明天',1,3)` → `'你好'`[^4] 2. **索引起始点** Hive中`substr``substring`的**起始索引均为1**(与Spark不同,Spark允许起始索引为0)[^1][^2] 3. **参数数量** ```sql -- substr必须指定3个参数 SELECT substr('abcde',2,3); -- 'bcd' -- substring可省略第三个参数(截取到末尾) SELECT substring('abcde',2); -- 'bcde' ``` #### 二、特殊场景对比 | 函数调用 | 结果 | 说明 | |---------|------|-----| | `substr('abcde',-2,3)` | `'de'` | 负数起始位置从末尾倒数 | | `substring('abcde',-2,3)` | `'abc'` | 负数起始位置视为0 | #### 三、最佳实践 1. **日期处理** 截取日期字段`yyyymmdd`中的年份: ```sql -- substr实现 SELECT substr(dt,1,4) -- substring实现 SELECT substring(dt,1,4) ``` 两者结果相同,但**推荐使用`substr`**(语义更明确) 2. **字符串清洗** 去除电话号码前缀: ```sql -- 截取第4位开始的全部字符 SELECT substring(tel,4); -- 更简洁 ``` #### 四、性能注意事项 虽然两者在Hive中性能差异可忽略,但在Spark SQL中: - `substring`底层基于Java String原生实现 - `substr`为兼容函数,可能存在额外类型转换 建议在Spark中优先使用`substring`
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值