如何在SQL Server中按规则提取列中的特定字符?
SQL Server 数据提取解决方案
针对你提出的三个列的提取需求,我来一步步拆解并给出对应的SQL实现,直接用SQL Server内置的字符串函数就能搞定:
需求回顾
- 列a:提取指定字段中
=后的6个字符(这里默认是针对eNodeB Function Name字段的内容) - 列b:提取
eNodeB Function Name部分中_与,之间的字符 - 列c:提取
Cell Name部分中_与,之间的字符
假设你的原始数据存储在名为your_table的表中,包含一个名为raw_data的字段,每条记录是类似样本的完整字符串(比如eNodeB Function Name=SMD085ML1_CIMANGLID, Local Cell ID=21, ...)。
完整SQL代码
SELECT -- 列a:提取eNodeB Function Name中=后的6个字符 SUBSTRING(raw_data, CHARINDEX('eNodeB Function Name=', raw_data) + LEN('eNodeB Function Name='), 6) AS column_a, -- 列b:提取eNodeB Function Name中_到,之间的字符 SUBSTRING(raw_data, CHARINDEX('_', raw_data, CHARINDEX('eNodeB Function Name=', raw_data)) + 1, CHARINDEX(',', raw_data, CHARINDEX('eNodeB Function Name=', raw_data)) - CHARINDEX('_', raw_data, CHARINDEX('eNodeB Function Name=', raw_data)) - 1) AS column_b, -- 列c:提取Cell Name中_到,之间的字符(取第一个_到,之间的内容) SUBSTRING(raw_data, CHARINDEX('_', raw_data, CHARINDEX('Cell Name=', raw_data)) + 1, CHARINDEX(',', raw_data, CHARINDEX('Cell Name=', raw_data)) - CHARINDEX('_', raw_data, CHARINDEX('Cell Name=', raw_data)) - 1) AS column_c FROM your_table;
代码解释
列a的实现:
- 用
CHARINDEX定位eNodeB Function Name=的起始位置,加上该字符串的长度,就得到=后面第一个字符的位置 - 再用
SUBSTRING从这个位置开始截取6个字符,正好满足需求
- 用
列b的实现:
- 先定位
eNodeB Function Name=的位置,以此为起点找第一个_的位置 - 再从同样的起点找后面第一个
,的位置 - 用
,的位置减去_的位置再减1,得到需要截取的长度,最后用SUBSTRING提取中间的内容
- 先定位
列c的实现:
- 逻辑和列b完全一致,只是把定位的起点换成
Cell Name=,这样就会提取Cell Name部分中_到,之间的内容
- 逻辑和列b完全一致,只是把定位的起点换成
样本数据测试
拿你提供的第一条样本数据:
eNodeB Function Name=SMD085ML1_CIMANGLID, Local Cell ID=21, Cell Name=C_SMD085ML1_CIMANGLIDML2, eNodeB ID=160085, Cell FDD TDD indication=CELL_FDD
执行SQL后得到的结果是:
column_a:SMD085column_b:CIMANGLIDcolumn_c:SMD085ML1_CIMANGLIDML2
如果你的列c需要提取最后一个_到,之间的内容(比如样本中Cell Name的ML2),可以调整列c的代码为:
SUBSTRING(raw_data, -- 定位最后一个_的位置 LEN(raw_data) - CHARINDEX('_', REVERSE(raw_data), CHARINDEX(',', REVERSE(raw_data)) + 1) + 2, -- 计算截取长度 CHARINDEX(',', raw_data, CHARINDEX('Cell Name=', raw_data)) - (LEN(raw_data) - CHARINDEX('_', REVERSE(raw_data), CHARINDEX(',', REVERSE(raw_data)) + 1) + 2) - 1) AS column_c
这样针对第一条样本,列c会得到ML2。
内容的提问来源于stack exchange,提问作者Septiana Fajrin
相关产品推荐
相关产品推荐

