首页 > 解决方案 > 从 SQL Sever 中的字符串模式中提取前后字符串

问题描述

我想从给定的文本中提取AC No,AC Name和。IFS Code我可以使用下面的代码进行提取,但文本位置可能会改变,它对我不起作用。

例如:

UserInfo="AC No: 644640011906AC Name: AkhilAC Type: CurrentIFSC Code: SBIB0003242"

或者

UserInfo="IFSC Code: SBIB0003242AC No: 644640011906AC Name: AkhilAC Type: Current"

SQL:

SELECT LTRIM(RTRIM(REPLACE(RIGHT(UserInfo,charindex(':',reverse(UserInfo))-1),'IFSC Code:','')))

请求某人帮助处理 SQL 查询。

标签: sqlsql-serversql-server-2012

解决方案


欢迎来到 SQL Server 字符串操作的美妙世界!

正如其他评论者所说,导入这样的数据是一个糟糕的主意。如果可以,请将精力集中在获得更好、更结构化的数据源上。


也就是说,如果您绝对不能更改数据源并且不想求助于 CLR 代码,那么您将不得不求助于一些非常丑陋的 SQL,只有当您能够掌握您尝试捕获的键值名称:

询问

declare @t table(UserID int,UserInfo varchar(200));
insert into @t values
 (1,'IFSC Code: SBIB0003242AC No: 644640011906AC Name: AkhilAC Type: Current')
,(2,'AC No: 644640011906AC Name: AkhilAC Type: CurrentIFSC Code: SBIB0003242')
;

with k as
(
    select *
    from(values('AC No:'),('AC Name:'),('AC Type:'),('IFSC Code:')) as k(k)
)
select UserID
      ,k.k
      ,ltrim(replace(substring(v.v,c.s,c.e-c.s),k.k,'')) as v
from @t as t
    cross join k
    cross apply(values(replace(
                         replace(
                           replace(
                             replace(
                               t.UserInfo
                               ,'AC No:'
                               ,case when k.k = 'AC No:' then 'AC No:' else '|' end
                               )
                             ,'AC Name:'
                             ,case when k.k = 'AC Name:' then 'AC Name:' else '|' end
                             )
                           ,'AC Type:'
                           ,case when k.k = 'AC Type:' then 'AC Type:' else '|' end
                           )
                         ,'IFSC Code:'
                         ,case when k.k = 'IFSC Code:' then 'IFSC Code:' else '|' end
                         ) + '|'
                      )
               ) as v(v)
    cross apply(values(patindex('%' + k.k + '%',v.v)
                      ,charindex('|',v.v,patindex('%' + k.k + '%',v.v))
                      )
               ) as c(s,e);

输出

+--------+------------+--------------+
| UserID |     k      |      v       |
+--------+------------+--------------+
|      1 | AC No:     | 644640011906 |
|      1 | AC Name:   | Akhil        |
|      1 | AC Type:   | Current      |
|      1 | IFSC Code: | SBIB0003242  |
|      2 | AC No:     | 644640011906 |
|      2 | AC Name:   | Akhil        |
|      2 | AC Type:   | Current      |
|      2 | IFSC Code: | SBIB0003242  |
+--------+------------+--------------+

推荐阅读