2017-09-29 19 views
1

サブ文字列とcharインデックス関数を使用してSQLで特定のビットのデータを選択する方法について多くの記事を見てきましたが、私のニーズに合わせることができません。特定の単語の後で文字の前に36文字を選択

特定の単語の後に36文字を選択しようとしています。開始語はsystemuser|で、文字列の最後にある;の前です。文字列にsystemuser|のインスタンスが複数ある場合は、最初のインスタンスを選択する必要があります。

サンプルデータ:

CREATE TABLE #Temp (col nvarchar(max)) 

INSERT INTO #Temp (col) 
values ('account|f50aa0e3-2f87-e311-8502-005056b412da;systemuser|765e4a01-1802-e611-80dc-5065f38aca11;systemuser|9fa34207-1802-e611-80dc-5065f38aca11;account|0aa90a25-1786-e311-8502-005056b412da;contact|381e4b65-4387-e311-8502-005056b412da;contact|32eecd7a-dc8c-e311-8502-005056b412da;contact|2e536442-ebf7-e511-a997-005056b412da;contact|f45fac8d-4187-e311-8502-005056b412da') 
,('contact|32eecd7a-dc8c-e311-8502-005056b412da') 
,('systemuser|ab1852fb-1702-e611-80dc-5065f38aca11') 
,('account|5d807c84-da86-e311-8502-005056b412da;systemuser|34ae3f0d-1802-e611-80dc-5065f38aca11') 
,('account|08a90a25-1786-e311-8502-005056b412da;contact|369ede29-4287-e311-8502-005056b412da;systemuser|01ae3f0d-1802-e611-80dc-5065f38aca11') 

SELECT * FROM #Temp 

これまでのところ私はsubstringcharindexの異なる組み合わせの多くを試みたが、私はそれが何を選択するように改正する必要がどのようにしてグリップを得ることができない怖いですが欲しいです。

SELECT 
     col 
     ,CASE WHEN col LIKE '%systemuser|%' THEN SUBSTRING(col, CHARINDEX('systemuser|', col), LEN(col)) ELSE NULL END AS TESTTHIS 
     , SUBSTRING(col, CHARINDEX('|', col), LEN(col)) 
     ,RIGHT(col, charindex('|', col) - 1) 
     --,SUBSTRING(col, CHARINDEX('systemuser|', col), CHARINDEX(';',col) - CHARINDEX('systemuser|', col) + Len(';')) 
    -- ,CASE WHEN LEFT(col, 3) = 'sys' THEN right(col, charindex('systemuser|', reverse(col)) - 1) ELSE NULL END AS ToUser 
    --,SUBSTRING(col, CHARINDEX('systemuser|', col) + 10, CHARINDEX(';', col) - (CHARINDEX('systemuser|', col) + 12)) 
    --,SUBSTRING(col, LEN(LEFT(col, CHARINDEX ('systemuser|', col))) + 1, LEN(col) - LEN(LEFT(col, CHARINDEX ('systemuser|', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX (';', col))) - 1) 
    FROM #temp 

コメントアウトされたコードは機能しません。私が試したことを示すためにそれらを貼り付けると思いました。上記の行の順序で

望ましい結果は:

'765e4a01-1802-e611-80dc-5065f38aca11' 
,NULL 
,'ab1852fb-1702-e611-80dc-5065f38aca11' 
,'34ae3f0d-1802-e611-80dc-5065f38aca11' 
,'01ae3f0d-1802-e611-80dc-5065f38aca11' 

誰もがとても親切、私は非常に感謝される私の問題で私を助けするようにすることでした。

ご協力いただきありがとうございます。

+0

だけのサンプルデータ&目的のO/Pを置きます。 –

+0

が私の望む結果を追加しました - 謝罪、私はあなたの編集で提案されたようにそれを書式に見えるようにする方法を知らない。 – Kriss

答えて

2

使用PATINDEX

SELECT 
    col, case when patindex('%systemuser|%', col) = 0 then NULL else 
    SUBSTRING(col, patindex('%systemuser|%', col) + 11, 36) end 
FROM #temp 
0

あなたはsystemuser|は、GUIDが続いていることを確認し、次のように:

DECLARE @pattern varchar(273) = '%systemuser|[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]%'; 

SELECT 
    CASE WHEN PATINDEX(@pattern, col)=0 THEN NULL ELSE 
    SUBSTRING(col, PATINDEX(@pattern, col)+11,36) END AS systemuserGUID 
FROM #temp 
関連する問題