sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan opdeles streng ved hjælp af skilletegn ved hjælp af T-SQL?

Til dine specifikke data kan du bruge

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

EDIT - charindex vs patindex

Test

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
 

Tidspunkter

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.
 

Konklusion

Tidspunkterne for CharIndex og PatIndex for 700.000 opkald er inden for 3,5% af hinanden, så jeg tror ikke, det ville betyde noget, hvad der end bruges. Jeg bruger dem i flæng, når begge kan fungere.



  1. ALTER TABLE-sætningen var i konflikt med CHECK-begrænsningen i SQL Server - SQL Server / TSQL Selvstudium, del 89

  2. Sådan bruges Distributed AD til at reducere patchingstiden i Oracle EBS

  3. SQL-kommandoer snydeark – Sådan lærer du SQL på 10 minutter

  4. SQL Server CASE-udtryk