sql 截取

 /*
	有时候我们需要将如下字符串进行分割
	'1,12,123'
	希望得到这样的结果:
	1
	12
	123
	
	这里借助master.dbo.spt_values表来实现!
 */

 --准备数据
IF OBJECT_ID('tempdb..#a') IS NOT NULL DROP TABLE #a
SELECT '1,12,123' AS ids INTO #a
 
 --截取一个字符串需要知道开始位置和截取长度
 
 --1.寻找截取的开始位置
 /*
	很明显对于这个字符串的开始截取位置是1(从第一个字符开始截取),那么尝试从位置1开始截取,每次截取1个字符
	使用SUBSTRING(a.ids,b.number,1)后可以看到字符串的每个字符都被截取成单个的字符(一共8个字符)
	但是要截取两位,三位的字符就得计算截取长度了
 */
 
 --2.计算截取的长度
 /*
	分别截取1,12,123这三个数字
	1,12,123
	SUBSTRING(ids,1,1)----1		
	SUBSTRING(ids,3,2)----12
	SUBSTRING(ids,6,3)----123
	两个问题:1.怎么获取开始截取位置?
			  2.怎么计算截取长度?
	
	解决第一个问题,可以通过加一个条件来筛选b.number,我们只需要1,3,6的值
	再看看这个字符串'1,12,123' 逗号所在的位置为:2,5
	试试在字符串'1,12,123' 前面加个逗号 ',1,12,123' 这时逗号的位置是:1,3,6
	ok开始位置就拿到了,加个条件实现:AND SUBSTRING(','+a.ids,b.number,1)=','
	看看效果:
	ids      number
	-------- -----------
	1,12,123 1
	1,12,123 3
	1,12,123 6
	
	解决第二个问题:我们知道截取长度分别是1,2,3 怎么计算?
	我们再来看看每个逗号的位置,以及number的数值
	ids      number      逗号位置
	-------- ----------- -----------
	1,12,123 1           2
	1,12,123 3           5
	1,12,123 6           0
	发现逗号位置减去number将得到结果:1,2,-6
	还差一点,如果逗号位置的最后一个数值是9就好了,怎么办?
	试试往后再加一个逗号看看:'1,12,123,'现在最后一个逗号的位置就是9了吧!
	逗号位置:CHARINDEX(',',a.ids+',',b.number)
	截取长度:CHARINDEX(',',a.ids+',',b.number)-b.number
	
	这样我们就可以计算截取长度了:
	ids      number      逗号位置        截取长度
	-------- ----------- ----------- -----------
	1,12,123 1           2           1
	1,12,123 3           5           2
	1,12,123 6           9           3
	
	截取的时候,从number开始,按截取长度来截取将是:
	ids      number      
	-------- ----------- --------
	1,12,123 1           1
	1,12,123 3           12
	1,12,123 6           123
 */

GO
SELECT a.*,b.number,
SUBSTRING(a.ids,b.number,
	CHARINDEX(',',a.ids+',',b.number)-b.number
)
FROM #a a,spt_values b
WHERE b.type='P'
AND b.number BETWEEN 1 and LEN(a.ids)   
AND SUBSTRING(','+a.ids,b.number,1)=','
 
 
 

### SAP ABAP 中使用 SQL 进行字符串截取 在 SAP ABAP 环境下,可以利用 `SELECT` 语句中的 `SUBSTRING` 函数来实现对数据库表中特定字段的字符串截取功能。此方法允许开发人员灵活地指定起始位置以及所需子串的长度。 对于具体的应用场景而言,在查询销售订单头部数据时可以通过如下方式仅选取交货单号(`VBELN`)中间部分的数据作为筛选条件: ```sql SELECT SINGLE * FROM VBAK WHERE SUBSTRING( VBAK~VBELN FROM 2 FOR 9 ) EQ '000000339' INTO @DATA(lwa_vbak). WRITE |{ lwa_vbak-vbeln ALPHA = IN }|. ``` 上述代码片段展示了如何通过 `SUBSTRING` 函数从 `VBAK~VBELN` 字段第二位开始读取九个字符并与给定值对比匹配记录[^2]。 另外一种常见需求是从现有字段中提取固定长度的部分并将其存储到新定义的结果集中去。下面的例子说明了怎样把物料编号(`MATNR`)第四个字符之后连续五个字符取出,并创建一个新的列名保存这些信息: ```abap SELECT marc~werks, " 工厂 SUBSTRING( marc~matnr FROM 4 FOR 5 ) AS matnr_t " 物料, 截取之后的 FROM marc WHERE marc~werks = '1000' INTO TABLE @DATA(lt_temp3) UP TO 5 ROWS. IF sy-subrc = 0. cl_demo_output=>display( lt_temp3 ). ENDIF. ``` 这段程序不仅实现了基于SQL层面的字符串处理逻辑,还能够高效地完成多条记录的同时转换工作[^3]。 值得注意的是,当涉及到更复杂的业务逻辑或者需要更高性能的情况下,则可能要考虑采用其他高级特性如OPEN SQL增强选项或是ABAP内部对象模型来进行优化改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值