2017-04-21 2 views
-2

예를 들어, '검은 화강암 난로는 t 형으로, 54 x 26'은 복잡한 논리가 아닌 단순한 t-sql 코드로 분리 된 열로 구성됩니다. 수평 대 수직 갈긴 VARCHAR 텍스트를 각 단어 열로 나누는 방법

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-server-2014'. 구문과 기능의 차이가 종종 답변에 영향을 미칩니다. – HABO

답변

0

홀수 요청 :

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는 PRODUCTNAME 추출물이다. 역동적 인 행동을 취하지 않으면 단어를 삭제할 위험이 있지만 필요한 경우 다음을 쉽게 확장 할 수 있습니다.

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

관련 문제