2016-05-15 51 views
1

我有一個包含空格和逗號分隔符的定義的表。定義看起來像這個「貓,狗,馬,房子,城市」。逗號之前或之後會出現空格。如何通過從列中提取逗號分隔的文本到子表中來正常化表格?

CREATE TABLE [dbo].[WordForm] 
(
    [WordFormId]  VARCHAR (20) NOT NULL, 
    [WordFormIdentity] INT   IDENTITY (1, 1) NOT NULL, 
    [WordId]   VARCHAR (20) NOT NULL, 
    [Definition]  VARCHAR (MAX) NULL, 

    PRIMARY KEY CLUSTERED ([WordFormId] ASC), 

    CONSTRAINT [FK_WordFormPos] 
     FOREIGN KEY ([PosId]) REFERENCES [dbo].[Pos] ([PosId]), 
    CONSTRAINT [FK_WordFormWord] 
     FOREIGN KEY ([WordId]) REFERENCES [dbo].[Word] ([WordId]) 
); 

我想刪除的定義柱,並用一個表格,表格中每行一個定義更換:

CREATE TABLE [dbo].[Definition] 
(
    [DefinitionId] INT IDENTITY (1, 1) NOT NULL, 
    [WordFormId] VARCHAR (20) NOT NULL, 
    [Text] VARCHAR (30) NOT NULL, 

    PRIMARY KEY CLUSTERED ([SynonymId] ASC), 

    CONSTRAINT [FK_DefinitionWordForm] 
     FOREIGN KEY ([WordFormId]) REFERENCES [dbo].[WordForm] ([WordFormId]) 
); 

有人建議我怎麼可以把數據從Definition柱插入的它放到新的Definition表中的行的文本列中?希望解決方案也將檢查Definition不爲空。

謝謝。

+0

只需使用字符串分割功能將其從逗號分割,修剪數據並過濾出空值。有沒有一個特定的部分,你有麻煩? –

+0

[亞倫伯特蘭拯救!](http://sqlperformance.com/2016/03/sql-server-2016/string-split) –

+1

正常化的好決定! – ATC

回答

3

您可以使用以下查詢拆分逗號分隔列表並獲取列表中每個定義值的一行。

Select [WordFormId] 
    ,RTRIM(LTRIM([Definition])) [Definition] 
from 
(
SELECT t.[WordFormId] 
      ,Split.a.value('.', 'VARCHAR(100)') [Definition] 
FROM 
    (SELECT [WordFormId] 
      ,Cast ('<X>' + Replace([Definition], ',', '</X><X>') + '</X>' AS XML) AS Data 
    FROM [dbo].[WordForm] 
    ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) 
)a 

我也用LTRIM()RTRIM()功能,擺脫任何空格的。

+0

謝謝。你可以添加一行來顯示如何將這些數據插入定義表中。 – Alan2

相關問題