2017-04-21 33 views
-2

我期待分割例如'黑色花崗岩爐邊到t形,54 x 26'分隔成各個簡單的t-sql代碼 - 不復雜的邏輯。如何將長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 

THIS IS PRODUCTNAME EXTRACT:

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

請不喊我們。沒有理由在全部大寫中發佈您的問題。它不會讓你的答案更快,它使文本更難閱讀,而且這真的很粗魯和煩人。當您查看主頁面上列出的所有帖子時,您看不到任何(除您的)全部大寫,因爲這樣做不合適。請現在停止。 –

+0

請閱讀[this](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)以獲取有關改善問題的一些提示。使用適當的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器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

相關問題