2017-04-21 34 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

相关问题