如何使用T-SQL使用分隔符char分割字符串?

Use*_*404 7 sql t-sql sql-server sql-server-2005

我在表的一列中有这个长字符串.我只想获得具体信息: - 我的表结构: -

Col1 = '123'
Col2 = 'AAAAA'
Col3 = 'Clent ID = 4356hy|Client Name = B B BOB|Client Phone = 667-444-2626|Client Fax = 666-666-0151|Info = INF8888877 -MAC333330554/444400800'
Run Code Online (Sandbox Code Playgroud)

我的选择陈述是: -

Select col1, col2, col3 from Table01
Run Code Online (Sandbox Code Playgroud)

但是在Col3中,我只需要'客户名称'的值'BB BOB'.

在Col3 -

  • 列分隔符是'|' 管道字符(例如'Client ID = 4356hy')

  • 键值定界符'='等于带有一个空格(前导和尾随)的符号.

请帮忙.

Ric*_*iwi 9

对于您的特定数据,您可以使用

Select col1, col2, LTRIM(RTRIM(SUBSTRING(
    STUFF(col3, CHARINDEX('|', col3,
    PATINDEX('%|Client Name =%', col3) + 14), 1000, ''),
    PATINDEX('%|Client Name =%', col3) + 14, 1000))) col3
from Table01
Run Code Online (Sandbox Code Playgroud)

编辑 - charindex与patindex

测试

select col3='Clent ID = 4356hy|Client Name = B B BOB|Client Phone = 667-444-2626|Client Fax = 666-666-0151|Info = INF8888877 -MAC333330554/444400800'
into t1m
from master..spt_values a
cross join master..spt_values b
where a.number < 100
-- (711704 row(s) affected)

set statistics time on

dbcc dropcleanbuffers
dbcc freeproccache
select a=CHARINDEX('|Client Name =', col3) into #tmp1 from t1m
drop table #tmp1

dbcc dropcleanbuffers
dbcc freeproccache
select a=PATINDEX('%|Client Name =%', col3) into #tmp2 from t1m
drop table #tmp2

set statistics time off
Run Code Online (Sandbox Code Playgroud)

计时

CHARINDEX:

 SQL Server Execution Times (1):
   CPU time = 5656 ms,  elapsed time = 6418 ms.
 SQL Server Execution Times (2):
   CPU time = 5813 ms,  elapsed time = 6114 ms.
 SQL Server Execution Times (3):
   CPU time = 5672 ms,  elapsed time = 6108 ms.

PATINDEX:

 SQL Server Execution Times (1):
   CPU time = 5906 ms,  elapsed time = 6296 ms.
 SQL Server Execution Times (2):
   CPU time = 5860 ms,  elapsed time = 6404 ms.
 SQL Server Execution Times (3):
   CPU time = 6109 ms,  elapsed time = 6301 ms.
Run Code Online (Sandbox Code Playgroud)

结论

CharIndex和PatIndex对700k调用的时间在3.5%之内,所以我认为无论使用哪个都不重要.当两者都可以工作时,我可以互换使用它们.