簡體   English   中英

根據列值拆分行

[英]Split a row based on a column value

我試圖將一行分成兩行,具體取決於該行中單元格中的值。 例如,我有以下表結構(它是一個沒有任何鍵,索引或任何東西的臨時表,我可以在另一個臨時表中選擇拆分結果):

Col1  |  Col2
a     |  one
b     |  two
c     |  three
d     |  one two
e     |  one two

然后它應該分為:

Col1  |  Col2
a     |  one
b     |  two
c     |  three
d     |  one
d     |  two
e     |  one
e     |  two

問題是我無法理解如何開始,我發現這兩個類似的問題,在我的例子中,它是一個空字符串:

將逗號分隔的字符串轉換為單獨的行

將值拆分為多行

我將使用XML來做到這一點

SELECT col1,
       Split.a.value('.', 'VARCHAR(100)') col2
FROM   (SELECT col1,
               col2,
               Cast ('<M>' + Replace(col2, ' ', '</M><M>') + '</M>' AS XML) AS Data
        FROM   Yourtable) AS A
       CROSS APPLY Data.nodes ('/M') AS Split(a) 

SQLFIDDLE DEMO

您可以使用UDF來處理字符串的拆分並在每個結果上運行它。 這是我很快就能完成的工作:

Create FUNCTION [dbo].[fnSplit](@text varchar(MAX), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(    
  position int IDENTITY PRIMARY KEY,
  value varchar(MAX)   
)
AS
BEGIN

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
  BEGIN  
    SET @index = CHARINDEX(@delimiter , @text)  
    IF (@index = 0) AND (LEN(@text) > 0)  
      BEGIN   
        INSERT INTO @Strings VALUES (@text)
          BREAK  
      END  
    IF (@index > 1)  
      BEGIN   
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))   
        SET @text = RIGHT(@text, (LEN(@text) - @index))  
      END  
    ELSE 
      SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END
  RETURN
END

測試數據:

Create Table #Temp 
(
    Col1 Varchar (20),
    Col2 Varchar (20)
)

Insert #Temp
Values ('a', 'one'), ('b', 'two'), ('c', 'three'), ('d', 'one two'), ('e', 'one two')

查詢:

Select  Col1, Value[Col2]
From    #Temp   T
Cross Apply dbo.fnSplit(T.col2, ' ')

結果:

Col1    Col2
a       one
b       two
c       three
d       one
d       two
e       one
e       two

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM