2016-11-09 6 views
0

私を助けてくれることを願っています。数字と特定の文字を任意の組み合わせで任意の順序で指定しているスティングのサブセットを選択してください

文字列の列リストを私が使用できる情報に分割しようとしています。 通常、この文字列には名前と予約の参照があります。 予約参照は、文字列の任意の部分に表示される数字(数字)のセットです。 下記のように また、時にはそれはKX本のように数字の前にKXがありますが、必ずしもそうではありません。 データを分割する新しいテンポラリテーブルを作成できたら、それを使って別のテーブルと照合して支払いを確認することができます。時々私はちょうど名前を作成し、選択リストには番号がない物語など8765jones8767 で

Narrative 
simon says KX1234 
Tracy Jones kx 2456 
KX3887Candy min 
Shelly 9876 
3424Tom 
kx5436michaelstone 
4353 Diana 
kx Anglia 
9387 
kx 2423 
kx4645 
James tin 
receipted twice 
12322452 AG 

時々ありリンクされているKX参照:

ので、これは私が働いているダミー列です。私はそれらをリンクする方法を見つけ出す必要があります。

私はそれにリンクされているKxがある場合、数字とespに興味があります。 私は自分の名前が

+1

を。あなた自身で何か試しましたか? CHARINDEXとSUBSTRINGを混在させて解析することは可能ですが、何か標準に従うことはありません。 –

答えて

0
Declare @YourTable table (Narrative varchar(50)) 
Insert Into @YourTable values 
('simon says KX1234'), 
('Tracy Jones kx 2456'), 
('KX3887Candy min'), 
('Shelly 9876'), 
('3424Tom'), 
('kx5436michaelstone'), 
('4353 Diana'), 
('kx Anglia'), 
('9387'), 
('kx 2423'), 
('kx4645'), 
('James tin'), 
('receipted twice '), 
('12322452 AG') 


Select A.* 
     ,Has_KX = Sign(CharIndex('KX',Narrative)) 
     ,Digits = B.Value 
From @YourTable A 
Cross Apply (
       Select Value=(Select ''+RetVal 
       From (Select RetSeq=N 
          ,RetVal=Substring(A.Narrative,N,1) 
        From (Select Top 10000 N=Row_Number() over(order by number) From master..spt_values) N 
        Where Substring(A.Narrative,N,1) like '[0-9]' 
        ) C For XML Path ('')) 
      ) B 

戻り

Narrative   Has_KX Digits 
simon says KX1234 1  1234 
Tracy Jones kx 2456 1  2456 
KX3887Candy min  1  3887 
Shelly 9876   0  9876 
3424Tom    0  3424 
kx5436michaelstone 1  5436 
4353 Diana   0  4353 
kx Anglia   1  NULL 
9387    0  9387 
kx 2423    1  2423 
kx4645    1  4645 
James tin   0  NULL 
receipted twice  0  NULL 
12322452 AG   0  12322452 

EDIT言うとただの数字と列の隣にKXと別の列を持つテーブルを作成することができれば - 私は

を追加する必要があります

ソースに数字の複数の文字列(例:kx12345 Amy 789)が含まれている場合、12345789

0

簡単にカスタマイズ可能で、あなたの超効率的な実行計画と同じ結果を取得します別のアプローチ:これは混乱のビットのように見える

Declare @YourTable table (Narrative varchar(50)) 
Insert Into @YourTable values 
('simon says KX1234'), ('Tracy Jones kx 2456'), ('KX3887Candy min'), ('Shelly 9876'), 
('3424Tom'), ('kx5436michaelstone'), ('4353 Diana'), ('kx Anglia'), ('9387'), ('kx 2423'), 
('kx4645'), ('James tin'), ('receipted twice '), ('12322452 AG'); 


WITH pos AS 
(
    SELECT 
    Narrative, 
    Case1 = PATINDEX('%kx [0-9][0-9][0-9][0-9]%',Narrative), 
    Case2 = PATINDEX('%kx[0-9][0-9][0-9][0-9]%',Narrative), 
    Case3 = PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',Narrative), 
    Case4 = PATINDEX('%[0-9][0-9][0-9][0-9]%',Narrative) 
    FROM @YourTable 
) 
SELECT 
    Narrative, 
    HasKX = SIGN(CHARINDEX('kx', Narrative)), 
    Digits = 
    CASE 
    WHEN case1 > 0 THEN SUBSTRING(Narrative, Case1+3, 4) 
    WHEN case2 > 0 THEN SUBSTRING(Narrative, Case2+2, 4) 
    WHEN case3 > 0 THEN SUBSTRING(Narrative, Case3, 8) 
    WHEN case4 > 0 THEN SUBSTRING(Narrative, Case4, 4) 
    END 
FROM pos;