2017-10-24 17 views
1

TSQL MSSQL 2008R2を改正するTSQL私はデータを修正するために支援が必要なデータ

をSUBSTRINGのPATINDEXとSTUFFを使用します。 私はこれまでのところ、助けが必要です。

サンプルデータ

[EDIT]のadditonalの例は、私はそうのようなデータを表示したい

DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50)) 
INSERT INTO @Table (NodePropertyValue) 
VALUES 
    (N'AA11✏AAA ZZZZ'), 
    (N'CRAP BB22✏BBB'), 
    (N'CC55✏CC1'), 
    (N'DD66✏666'), 
    (N'EE55✏EEE  ES177'), 
    (N'RUBBISH FF22✏FFF XXXXXX'), 
    (N'NONSENSE') 

を追加しました。 NCHAR(9999)または鉛筆が存在し、次の3文字が文字の場合は、3文字目の後にslash(/)を追加します。他の文字が追加された後に存在する場合は、slashを削除してください。だから、[AA11AHAAA ZZZZ]は[AA11AHAAA /]に更新されるべきです。

NCHAR(9999)が存在し、先行する4文字の前に文字がある場合は、それらを削除してください。したがって、[CRAP BB22UCBB]は[BB22UCBB /]に更新する必要があります。 [NONSENSE]はNULLと表示されます。

expected

これは私の知る限りが持っているようです。あなたが見る通り、私はslashを追加し、必要のない文字を削除することに固執しています。

SELECT 
    V.NodePropertyValue 'Orignal' 
    ,CASE --Pencil NCHAR(9999) exists 
     WHEN PATINDEX('%'+NCHAR(9999)+'%', UPPER(V.NodePropertyValue)) > 0 
      THEN 
       CASE 
        WHEN --FIRST 4 chars match XX11 and 5th char equals NCHAR(9999) 
         PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0 
         AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999) 
        THEN 
         STUFF(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4 
          , 50 
          , SUBSTRING(V.NodePropertyValue, PATINDEX('[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50)) 
        WHEN --Any 4 chars match XX11 and preceding char is space and 5th char equals NCHAR(9999) 
         PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue)) > 0 
         AND SUBSTRING(V.NodePropertyValue, PATINDEX('%[A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 1) = NCHAR(9999) 
        THEN 
         STUFF(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4 
          , 50 
          , SUBSTRING(V.NodePropertyValue, PATINDEX('% [A-Z][A-Z][0-9][0-9]%', UPPER(V.NodePropertyValue))+ 4, 50)) 
        ELSE 
         NULL 
       END 
     ELSE 
      NULL 
    END 'Updated' 
FROM 
    @Table V 
+0

次の文字列の出力は何ですか? 'N'A1AHA'' –

+0

@ZoharPeledもしそれが例だったなら、結果は' NULL'になります。 –

+0

私はちょうどあなたが言及しなかったパターンについて尋ねています。だからあなたが何を記述するか他のものはnullを返す必要がありますか? –

答えて

1

があなたの望む結果を得るための方法である:

サンプルテーブルを作成し、移入(私がコメント欄で私たちの会話に基づいていくつかのより多くのサンプルデータを追加しました)

DECLARE @Table TABLE (NodePropertyValue NVARCHAR(50)) 
INSERT INTO @Table (NodePropertyValue) 
VALUES 
(N'AA11✏AAA ZZZZ'), 
(N'CRAP BB22✏BBB'), 
(N'EE55✏EEE  ES177'), 
(N'RUBBISH FF22✏FFF XXXXXX'), 
(N'AA✏AAA ZZZZ'), 
(N'AA✏A2A ZZZZ'), 
(N'AA✏A'), 
(N'NONSENSE') 

所望のパターンの開始および終了を計算するための計算機

;WITH CTE AS 
(
SELECT NodePropertyValue, 
     -- note: there are are 4 underscores before the pencil 
     PATINDEX('%____'+ NCHAR(9999) +'[a-z][a-z][a-z]%', NodePropertyValue) As startPattern, 
     CHARINDEX(NCHAR(9999), NodePropertyValue) + 3 As EndPattern 
FROM @Table 
) 

クエリcte:

SELECT NodePropertyValue, 
     CASE WHEN startPattern > 0 THEN 
      SUBSTRING(NodePropertyValue, startPattern, EndPattern-startPattern+1) + '/' 
     ELSE 
      NULL 
     END As Updated 
FROM CTE 

結果:

NodePropertyValue   Updated 
AA11✏AAA ZZZZ    AA11✏AAA/ 
CRAP BB22✏BBB    BB22✏BBB/ 
EE55✏EEE  ES177   EE55✏EEE/ 
RUBBISH FF22✏FFF XXXXXX  FF22✏FFF/ 
AA✏AAA ZZZZ     NULL 
AA✏A2A ZZZZ     NULL 
AA✏A      NULL 
NONSENSE      NULL 

See a live demo on rextester.

+0

私が望むもののように見えます –

+0

喜んで助けてください:-) –

1

鉛筆と数字の後に常に文字がある場合は、これで十分ですか?ここで

select case when patindex('%' + nchar(9999) + '%' , NodePropertyValue)=0 then null 
      else substring(NodePropertyValue, patindex('%' + nchar(9999) + '%', NodePropertyValue)-4, 8) + '/' 
     end as StringStart 
from @Table 
+0

しかし、鉛筆の後に数字や文字と数字が混在することがあります。どちらの場合でも、これは「NULL」になるはずです –

関連する問題