2017-08-07 12 views
0

MS SQLで文字列を取り、単語分割を避けるためにスペースで分割する方法を作成しました。これは、各行が17文字以上の場合、文字列を新しい行の3つの別々の文字列に分割します。MS SQLで単語を分割する

DECLARE @Prod_Desc varchar(50) = '12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE' 
DECLARE @Prod_Desc_Line2 varchar(50); 
DECLARE @Prod_Desc_Line3 varchar(50); 

-- Generate second line and center 
IF len(@Prod_Desc) >= 17 
BEGIN 
SELECT @Prod_Desc_Line2 = SUBSTRING(@Prod_Desc, 18 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc, 1, 17)), 1), len(@Prod_Desc) + CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc, 1, 17)), 1) - 17); 
SELECT @Prod_Desc = SUBSTRING(@Prod_Desc, 1, 17 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc, 1, 17)), 1)); 
END; 

-- Generate third line and center 
IF len(@Prod_Desc_Line2) >= 17 
BEGIN 
SELECT @Prod_Desc_Line3 = SUBSTRING(@Prod_Desc_Line2, 18 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc_Line2, 1, 17)), 1), len(@Prod_Desc_Line2) + CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc_Line2, 1, 17)), 1) - 17); 
SELECT @Prod_Desc_Line2 = SUBSTRING(@Prod_Desc_Line2, 1, 17 - CHARINDEX(' ', REVERSE(SUBSTRING(@Prod_Desc_Line2, 1, 17)), 1)); 
END; 

PRINT(@Prod_Desc); 
PRINT(@Prod_Desc_Line2); 
PRINT(@Prod_Desc_Line3); 

出力:

12345 BAG 15 LB 
NR SML BTS 
CHICKEN MEAL AND RICE 

それは私がそれをしたいどのように動作しますが、私はそれがずさんに見えると思います。私は、この文字列の分割を行うより良い方法があるのか​​、そうするための関数が存在するのか疑問に思っていましたか?

説明のために、文字列が17文字を超える場合、その制限がヒットする前の最後のスペースを見つけ出し、元の文字列から切り捨てて、次の行の次の文字列に追加します。

+1

これは、より良いコードレビューに掲載されます。 https://codereview.stackexchange.com/ –

+0

これを行うには他にもたくさんの方法があります。この質問は、最後の行が7500文字のときにどうなるのですか? – Hogan

+0

あなたはそれが長すぎることを望んでいますか?また、これを一連のデータに適用しようとしていますか?もしそうなら、あなたの現在のロジックに基づいてどこかにループがあると思います。これは本当ですか? – scsimon

答えて

2

一つのオプション

DECLARE @S varchar(100) = '12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE' 
Declare @MaxLen int = 17 

Select Line1 
     ,Line2 = ltrim(stuff(Line2,1,len(Line1),'')) 
     ,Line3 = ltrim(stuff(Line3,1,len(Line2),'')) 
From (
     Select Line1 = Left(@S,@MaxLen-CharIndex(' ',Reverse(Left(@S,@MaxLen)))) 
       ,Line2 = Left(@S,@MaxLen*2-CharIndex(' ',Reverse(Left(@S,@MaxLen*2)))) 
       ,Line3 = @S 
    ) A 

戻り

Line1    Line2  Line3 
12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE 

EDITセットアプローチ

Declare @YourTable table (ID int,SomeCol varchar(max)) 
Insert Into @YourTable values 
(1,'12345 BAG 15 LB NR SML BTS CHICKEN MEAL AND RICE') 
,(2,'Some Random Text should be split into 3 strings') 

Declare @MaxLen int = 18 --<< Changed to 18 

    Select A.ID 
      ,Line1 
      ,Line2 = ltrim(stuff(Line2,1,len(Line1),'')) 
      ,Line3 = ltrim(stuff(Line3,1,len(Line2),'')) 
    From @YourTable A 
    Cross Apply (
        Select Line1 = Left(SomeCol,@MaxLen-CharIndex(' ',Reverse(Left(SomeCol,@MaxLen)))) 
          ,Line2 = Left(SomeCol,@MaxLen*2-CharIndex(' ',Reverse(Left(SomeCol,@MaxLen*2)))) 
          ,Line3 = SomeCol 
       ) B  

戻り

ID Line1    Line2     Line3 
1 12345 BAG 15 LB  NR SML BTS CHICKEN  MEAL AND RICE 
2 Some Random Text should be split  into 3 strings 
+0

私はそれが幅広く適用できるので私からは1つだと思っていますが、OPロジックはそう思わないでしょう。 – scsimon

関連する問題