2016-08-09 16 views
-1

文字列の特定の部分を抽出しようとしています。文字列の特定の部分を選択する

07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER 

たとえば、ここには複数の年の範囲の説明があります。私は07-1607-1008-16、および09-16を抽出する必要があります。私は07-16を抽出するコードを持っていますが、私はこの時点でコードで失われ始めています。 それらを抽出する方法を理解しようとしています。私はまた私達のデータベースではモデルと比較するためのモデルを取得する必要がありますが、説明の多くは、例えば、それらの小さな矛盾

を持っている:Ford F-150, F-250... Ford F 150, F 250.. Ford F150, F250.. etc.

F-150はにデータベースに格納されている正しい値になりますと比べて。ここで

は、サンプルデータを作成するために、一時テーブル・スクリプト

CREATE TABLE #mytable(
DESCRIPTION  VARCHAR(101) 
); 
INSERT INTO #mytable VALUES ('07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE REAR FLOORLINER GREY' ); 
INSERT INTO #mytable VALUES ('08-16 F250/F350/F350/F-450 TECHSHADE NA'  ); 
INSERT INTO #mytable VALUES ('07-16 SILVERADO/SIERRA 1500/15-16 SILVERADO/SIERRA 2500/3500 5FT 9.25IN TECHLINER BLACK '); 
INSERT INTO #mytable VALUES ('97-94 BLAZER FS/95-99 TAHOE 2DR/92-97 YUKON 2DR CARGO LINERS TAN'); 
INSERT INTO #mytable VALUES ('66-72 MERCEDES-BENZ SE/SEL 4.5/108/109 66-73 250S/250SE/280S/300SEB/300SEL TECHSHADE '  ); 
INSERT INTO #mytable VALUES ('66-70 FAIRLANE/TORINO 68-71 RANCHERO TECHSHADE '  ); 
INSERT INTO #mytable VALUES ('07-13 MINI COOPER/12-13 COUPE/ROADSTER/02-06 CLUBMAN FRONT RUBBER MATS TAN'); 
INSERT INTO #mytable VALUES ('60-63 PORSCHE 356B 64-65 356C TECHSHADE '); 

は、これは私がAを探しています私は最初の年の範囲

SELECT Left(
      SubString(DESCRIPTION, PatIndex('%[0-9.-]%', DESCRIPTION), 5), 
      PatIndex('%[^0-9.-]%', SubString(DESCRIPTION, PatIndex('%[0-9.-]%', DESCRIPTION), 5) + 'X')-1) 
FROM #myTable 

を引っ張るために、これまで使用してきたコードです提供されたクエリで明らかな類似の結果私はそれらを分離する必要があります。そのため、比較のために年をdatetime形式に変換することができます。第二範囲は、それらのすべては、このいずれか07-16 ACADIA/07-10 OUTLOOK

どのように多くの異なった年の範囲のようにバックスラッシュで分割されていない、始まる

+-------+-------+-------+-------+ 
| rng1 | rng2 | rng3 | rng4 | 
+-------+-------+-------+-------+ 
| 07-16 | 07-10 | 08-16 | 09-16 | 
| 08-16 |  |  |  | 
| 07-16 | 15-16 |  |  | 
| 97-94 | 95-99 | 92-97 |  | 
| 66-72 | 66-73 |  |  | 
| 66-70 | 68-71 |  |  | 
| 07-13 | 12-13 | 02-06 |  | 
| 60-63 | 34-65 |  |  | 
+-------+-------+-------+-------+ 

年の範囲のほとんどは、初めに開始するには、決定する方法はありません各特定の記述にどれぐらいの数があるかを知ることなしには説明できない。これらは私が実際に使っているサンプルです。

最も重要な問題は、私は可能性のために求めているとどのように1は、解決策を見つけるん何です。

+0

を必要に応じて、多くのことを説明していますが、現在のケースと欲望の出力を記述する固有のものではありません。 [** How-to-Ask **](http:// stackoverflow。com/help/how-to-ask) \t \t [** START **](http://spaghettidba.com/2015/04/24/how-to-post-at)に最適な場所です-sql-a-public-forum /)を使用して質問品質を改善し、より良い回答を得る方法を学びます。 –

+0

すべてのレコードは常に正確に4つの一致を持つか、またはこれは異なる可能性がありますか? –

+0

「私は抽出する必要があります。」これを一般的なルールとして説明します。 –

答えて

-1

私は何をあなたが探しては正規表現だと思います。正規表現を使用せずに同じことができますが、正規表現はコンパクトな解析関数です。

https://regex101.com/

このサイトは構築し、正規表現をテストするために使用することができ、私が代わりに上記のあなたの例のように、再利用可能な機能を構築することだと思います。あなたは、文字列スプリッタを必要とするよう

+1

正規表現の数(つまり構造)が固定され、事前にわかっている場合にのみ正規表現が機能します。 –

0

が鳴ります。ここにいくつかの素晴らしいオプションがあります。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings StringSplit_XMLを使用すると、このようなことができます。

DECLARE @TABLE AS TABLE (DESCRIPTION VARCHAR(101)) 

INSERT INTO @table VALUES ('07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER') 

select LEFT(Item, 5) as YourResult 
    , * 
from @TABLE t 
cross apply dbo.SplitStrings_XML(t.Description, '/') 
0
DECLARE @TABLE AS TABLE (ID int,DESCRIPTION VARCHAR(101)) 
Insert Into @Table values 
(1,'07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER') 

SELECT A.ID 
     ,A.DESCRIPTION 
     ,B.Key_PS 
     ,B.Key_Value 
     ,SomeField1 = substring(B.Key_Value,1,5) 
     ,SomeField2 = substring(B.Key_Value,6,200) 
FROM @TABLE A 
Cross Apply (Select * from [dbo].[udf-Str-Parse](A.DESCRIPTION,'/')) B 

戻り

ID DESCRIPTION               Key_PS Key_Value  SomeField1 SomeField2 
1 07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER 1   07-16 ACADIA 07-16  ACADIA 
1 07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER 2   07-10 OUTLOOK 07-10  OUTLOOK 
1 07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER 3   08-16 ENCLAVE 08-16  ENCLAVE 
1 07-16 ACADIA/07-10 OUTLOOK/08-16 ENCLAVE/09-16 TRAVERSE FLOORLINER 4   09-16 TRAVERS 09-16  TRAVERSE FLOORLINER 

UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max)) 
As 
Begin 
    Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) 
    Insert Into @ReturnTable Select Key_Value = ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String) 
    Return 
End 
関連する問題