sql >> Databáze >  >> RDS >> Sqlserver

Jak rozdělit řetězec pomocí oddělovacího znaku pomocí T-SQL?

Pro vaše konkrétní údaje můžete použít

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

Časování

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.

Závěr

Časování pro CharIndex a PatIndex pro 700 000 volání jsou v rozmezí 3,5 % od sebe, takže si nemyslím, že by záleželo na tom, co se použije. Používám je zaměnitelně, když mohou fungovat oba.



  1. INSERT INTO @TABLE EXEC @query s SQL Server 2000

  2. SpringBoot+Kotlin+Postgres a JSONB:org.hibernate.MappingException:Žádné mapování dialektů pro typ JDBC

  3. Zobrazit hodnoty z tabulky databáze MySQL v tabulce HTML na webové stránce

  4. SQL dotaz pro stromovou tabulku