2017-04-21 11 views
-2

複雑なロジックではなく、単純なt-sqlコードを持つ別々の列に「黒い花崗岩の難しさをt形に、54 x 26 '長いVARCHARテキストを各単語の列に分割する方法

with C1 as 
(
select ProductName, SUBSTRING(ProductName, 1, CHARINDEX(' ', ProductName)) as firstword, 
SUBSTRING(ProductName, CHARINDEX(' ', ProductName), LEN(ProductName)) as secondword 
from [dbo].[AProducts] 
), 
C2 AS 
(
select firstword, secondword 
from C1 
) 

select firstword, SUBSTRING(secondword, 1, CHARINDEX(' ', secondword)) as z from C2 

これはPRODUCTNAME抽出物である:縦対横へ行く

To credit against Invoice 104 - overcharged in error 
Black Granite Hearth to t-shape, 54 x 26 
Black Granite Header 38 x 5, Slips 32 x 5 
Nero Zimbabwe 30mm worktops, supplied and fitted 
+1

米国AT SHOUTしないでください。あなたの質問をすべての大文字で記入する理由はありません。速く答えを出すことはできません。テキストを読むのが難しくなります。本当に失礼で迷惑です。メインページに掲載されているすべての投稿を見ると、すべての大文字では表示されません。今はやめてください。 –

+0

質問を改善するためのヒントについては、[こちら](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)をお読みください。適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 – HABO

答えて

0

奇数要求。動的にすることなく、単語を削除する危険性がありますが、必要に応じて次のように展開するのは簡単です。

Declare @YourTable table (PRODUCTNAME varchar(max)) 
Insert Into @YourTable values 
('To credit against Invoice 104 - overcharged in error') 
,('Black Granite Hearth to t-shape, 54 x 26') 
,('Black Granite Header 38 x 5, Slips 32 x 5') 
,('Nero Zimbabwe 30mm worktops, supplied and fitted') 

Select A.* 
     ,C.* 
From @YourTable A 
Cross Apply (Select CleanString = replace(replace(replace(A.ProductName,' x ','x'),',',''),' - ',' ')) B 
Cross Apply (
       Select Pos1 = ltrim(rtrim(xDim.value('/x[1]' ,'varchar(max)'))) 
         ,Pos2 = ltrim(rtrim(xDim.value('/x[2]' ,'varchar(max)'))) 
         ,Pos3 = ltrim(rtrim(xDim.value('/x[3]' ,'varchar(max)'))) 
         ,Pos4 = ltrim(rtrim(xDim.value('/x[4]' ,'varchar(max)'))) 
         ,Pos5 = ltrim(rtrim(xDim.value('/x[5]' ,'varchar(max)'))) 
         ,Pos6 = ltrim(rtrim(xDim.value('/x[6]' ,'varchar(max)'))) 
         ,Pos7 = ltrim(rtrim(xDim.value('/x[7]' ,'varchar(max)'))) 
         ,Pos8 = ltrim(rtrim(xDim.value('/x[8]' ,'varchar(max)'))) 
         ,Pos9 = ltrim(rtrim(xDim.value('/x[9]' ,'varchar(max)'))) 
       From (Select Cast('<x>' + replace((Select replace(B.CleanString,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as X 
      ) C 

戻り

enter image description here

関連する問題