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')
键值定界符'='等于带有一个空格(前导和尾随)的符号.
请帮忙.
对于您的特定数据,您可以使用
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)
测试
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%之内,所以我认为无论使用哪个都不重要.当两者都可以工作时,我可以互换使用它们.