从 SQL 服务器中的字符串模式中提取前后字符串
Extract string before and after from string pattern in 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 查询。
欢迎来到SQL服务器字符串操作的精彩世界!
正如其他评论者所说,像这样导入数据是一个糟糕的想法。如果可以,请集中精力获得更好、更结构化的数据源。
就是说,如果您绝对不能更改数据源并且不想求助于 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 |
+--------+------------+--------------+
select
SUBSTRING(UserInfo, CHARINDEX('AC No: ',UserInfo)+7,
( select min(x*(case x when 0 then null else 1 end))
from
(
VALUES
(CHARINDEX('AC Name: ',UserInfo,CHARINDEX('AC No: ',UserInfo)+7)),
(CHARINDEX('AC Type: ',UserInfo,CHARINDEX('AC No: ',UserInfo)+7)),
(CHARINDEX('IFSC Code: ',UserInfo,CHARINDEX('AC No: ',UserInfo)+7)),
(LEN(UserInfo)+1)
)
AS value(x)
) - (CHARINDEX('AC No: ',UserInfo)+7)
)
as AC_No,
SUBSTRING(UserInfo, CHARINDEX('AC Name: ',UserInfo)+9,
( select min(x*(case x when 0 then null else 1 end))
from
(
VALUES
(CHARINDEX('AC No: ',UserInfo,CHARINDEX('AC Name: ',UserInfo)+9)),
(CHARINDEX('AC Type: ',UserInfo,CHARINDEX('AC Name: ',UserInfo)+9)),
(CHARINDEX('IFSC Code: ',UserInfo,CHARINDEX('AC Name: ',UserInfo)+9)),
(LEN(UserInfo)+1)
)
AS value(x)
) - (CHARINDEX('AC Name: ',UserInfo)+9)
)
as AC_Name,
SUBSTRING(UserInfo, CHARINDEX('IFSC Code: ',UserInfo)+11,
( select min(x*(case x when 0 then null else 1 end))
from
(
VALUES
(CHARINDEX('AC No: ',UserInfo,CHARINDEX('IFSC Code: ',UserInfo)+11)),
(CHARINDEX('AC Type: ',UserInfo,CHARINDEX('IFSC Code: ',UserInfo)+11)),
(CHARINDEX('AC Name: ',UserInfo,CHARINDEX('IFSC Code: ',UserInfo)+11)),
(LEN(UserInfo)+1)
)
AS value(x)
) - (CHARINDEX('IFSC Code: ',UserInfo)+11)
)
as IFSC_Code
from test
那么最好只执行一次,同时将数据加载到分段 table 等中,然后将这些值存储在生产中的适当字段中 table.
Fiddle 示例:
https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=a5fdfbbd6a0b4657602af39744993a91
我想从给定文本中提取 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 查询。
欢迎来到SQL服务器字符串操作的精彩世界!
正如其他评论者所说,像这样导入数据是一个糟糕的想法。如果可以,请集中精力获得更好、更结构化的数据源。
就是说,如果您绝对不能更改数据源并且不想求助于 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 |
+--------+------------+--------------+
select
SUBSTRING(UserInfo, CHARINDEX('AC No: ',UserInfo)+7,
( select min(x*(case x when 0 then null else 1 end))
from
(
VALUES
(CHARINDEX('AC Name: ',UserInfo,CHARINDEX('AC No: ',UserInfo)+7)),
(CHARINDEX('AC Type: ',UserInfo,CHARINDEX('AC No: ',UserInfo)+7)),
(CHARINDEX('IFSC Code: ',UserInfo,CHARINDEX('AC No: ',UserInfo)+7)),
(LEN(UserInfo)+1)
)
AS value(x)
) - (CHARINDEX('AC No: ',UserInfo)+7)
)
as AC_No,
SUBSTRING(UserInfo, CHARINDEX('AC Name: ',UserInfo)+9,
( select min(x*(case x when 0 then null else 1 end))
from
(
VALUES
(CHARINDEX('AC No: ',UserInfo,CHARINDEX('AC Name: ',UserInfo)+9)),
(CHARINDEX('AC Type: ',UserInfo,CHARINDEX('AC Name: ',UserInfo)+9)),
(CHARINDEX('IFSC Code: ',UserInfo,CHARINDEX('AC Name: ',UserInfo)+9)),
(LEN(UserInfo)+1)
)
AS value(x)
) - (CHARINDEX('AC Name: ',UserInfo)+9)
)
as AC_Name,
SUBSTRING(UserInfo, CHARINDEX('IFSC Code: ',UserInfo)+11,
( select min(x*(case x when 0 then null else 1 end))
from
(
VALUES
(CHARINDEX('AC No: ',UserInfo,CHARINDEX('IFSC Code: ',UserInfo)+11)),
(CHARINDEX('AC Type: ',UserInfo,CHARINDEX('IFSC Code: ',UserInfo)+11)),
(CHARINDEX('AC Name: ',UserInfo,CHARINDEX('IFSC Code: ',UserInfo)+11)),
(LEN(UserInfo)+1)
)
AS value(x)
) - (CHARINDEX('IFSC Code: ',UserInfo)+11)
)
as IFSC_Code
from test
那么最好只执行一次,同时将数据加载到分段 table 等中,然后将这些值存储在生产中的适当字段中 table.
Fiddle 示例: https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=a5fdfbbd6a0b4657602af39744993a91