sql >> データベース >  >> RDS >> Sqlserver

T-SQLを使用して区切り文字を使用して文字列を分割するにはどうすればよいですか?

    特定のデータについては、次を使用できます

    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
    

    編集-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
    

    タイミング

    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.
    

    結論

    700k呼び出しのCharIndexとPatIndexのタイミングは、互いに3.5%以内であるため、どちらを使用しても問題はないと思います。両方が機能する場合は、同じ意味で使用します。



    1. 衝突することなくランダムな整数を生成する

    2. MariaDBでのSTRCMP()のしくみ

    3. SpotlightCloudによるAzureSQLDBアナウンスのサポート(プレビュー)

    4. MariaDBでのNOW()のしくみ