2014-11-10 3 views
0

У меня есть значения в столбце в таблице Например: Abc-a, d, f, g, h; Acd-b, h, i, j; Asx- i, k, l, mразделите столбец на три отдельных столбца с разделителем

Теперь, что я хочу, мне нужно, чтобы значения a, d, f, g, h копировались в отдельный столбец с именем «Abc» аналогично b, h, i, j в другой столбец «Acd» (добавив ясность в указанную выше точку, я хочу, чтобы все значения, разделенные запятыми, попадали под отдельный столбец, а имя столбца будет строкой, которая префикс перед «-»). Я должен быть разбит с использованием разделителя ';'

+0

Не хранить значения, разделенные запятой, в одном столбце. Читайте о нормализации. – fancyPants

ответ

1

Прежде всего не хранить данные в виде значений, разделенных запятой, его плохая практика, и вы всегда должны нормализовать данные

Теперь, насколько текущая ситуация беспокойство и если шаблон же вы можете извлечь данные, ниже, используя функцию substring_index()

mysql> select substring_index(substring_index('Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m',';',1),'Abc-',-1) as Abc ; 
+-----------+ 
| Abc  | 
+-----------+ 
| a,d,f,g,h | 
+-----------+ 

mysql> select substring_index(substring_index('Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m',';',2),'Acd-',-1) as Acd; 
+---------+ 
| Acd  | 
+---------+ 
| b,h,i,j | 
+---------+ 

mysql> select substring_index(substring_index('Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m',';',-1),'Asx-',-1) as Asx; 
+---------+ 
| Asx  | 
+---------+ 
| i,k,l,m | 
+---------+ 

Наконец положить все вместе, вы можете иметь команду обновления в

update your_table 
set 
Abc = substring_index(substring_index('Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m',';',1),'Abc-',-1), 
Acd = substring_index(substring_index('Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m',';',2),'Acd-',-1), 
Asx = substring_index(substring_index('Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m',';',-1),'Asx-',-1) ; 

Обратите внимание, что я добавил полную строку в приведенном выше примере, вы можете просто добавить имя столбца, где значения хранятся

0
DECLARE @DATA NVARCHAR(MAX), @COLUMNROWCOUNT INT, @COLUMNVALUE NVARCHAR(MAX) 
DECLARE @VALUEROWCOUNT INT, @VALUE NVARCHAR(MAX), @SQLQUERY NVARCHAR(MAX) 
SET @DATA='Abc-a,d,f,g,h;Acd-b,h,i,j;Asx-i,k,l,m' 

CREATE TABLE #TEMPCOLUMNS(
    ID int IDENTITY(1,1) NOT NULL, 
    VALUE NVARCHAR(MAX) 
) 
CREATE TABLE #TEMPVALUES(
    ID int IDENTITY(1,1) NOT NULL, 
    VALUE NVARCHAR(MAX) 
) 
CREATE TABLE #TEMPCOLUMNVALUE(
    ID int IDENTITY(1,1) NOT NULL, 
    COLUMNNAME NVARCHAR(MAX), 
    COLUMNVALUE NVARCHAR(MAX) 
) 

INSERT INTO #TEMPCOLUMNS 
SELECT value AS VALUE 
FROM dbo.Split(@DATA, ';') 

SET @COLUMNROWCOUNT=1 
SET @COLUMNVALUE='' 
WHILE @COLUMNROWCOUNT <=(SELECT COUNT(*) FROM #TEMPCOLUMNS) 
BEGIN 
    SET @COLUMNVALUE=(SELECT VALUE FROM #TEMPCOLUMNS WHERE [email protected]) 
    TRUNCATE TABLE #TEMPVALUES 

    INSERT INTO #TEMPVALUES 
    SELECT value AS VALUE 
    FROM dbo.Split(@COLUMNVALUE, '-') 

    INSERT INTO #TEMPCOLUMNVALUE SELECT 
    (SELECT VALUE FROM #TEMPVALUES WHERE ID=1) COLUMNNAME, 
    (SELECT VALUE FROM #TEMPVALUES WHERE ID=2) COLUMNVALUE 

    SET @[email protected]+1 
END 

SET @VALUEROWCOUNT=1 
SET @VALUE='' 
SET @SQLQUERY='CREATE TABLE #TEMP(' 
WHILE @VALUEROWCOUNT <=(SELECT COUNT(*) FROM #TEMPCOLUMNVALUE) 
BEGIN 
    SET @VALUE=(SELECT COLUMNNAME FROM #TEMPCOLUMNVALUE WHERE [email protected]) 
    SET @[email protected][email protected]+' NVARCHAR(MAX)' 
    IF (@VALUEROWCOUNT <>(SELECT COUNT(*) FROM #TEMPCOLUMNVALUE)) 
    BEGIN 
     SET @[email protected]+',' 
    END 
    SET @[email protected]+1 
END 
SET @[email protected]+')' 

SET @VALUEROWCOUNT=1 
SET @VALUE='' 
SET @[email protected]+'INSERT INTO #TEMP SELECT ' 
WHILE @VALUEROWCOUNT <=(SELECT COUNT(*) FROM #TEMPCOLUMNVALUE) 
BEGIN 
    SET @VALUE=(SELECT COLUMNVALUE FROM #TEMPCOLUMNVALUE WHERE [email protected]) 
    SET @[email protected]+''''[email protected]+'''' 
    IF (@VALUEROWCOUNT <>(SELECT COUNT(*) FROM #TEMPCOLUMNVALUE)) 
    BEGIN 
     SET @[email protected]+',' 
    END 
    SET @[email protected]+1 
END 
SET @[email protected]+'SELECT * FROM #TEMP DROP TABLE #TEMP' 

PRINT(@SQLQUERY) 
EXEC(@SQLQUERY) 

DROP TABLE #TEMPCOLUMNS 
DROP TABLE #TEMPVALUES 
DROP TABLE #TEMPCOLUMNVALUE 

SQL ФУНКЦИЯ:

CREATE FUNCTION [dbo].[Split]  
( 
    @List nvarchar(2000),  
    @SplitOn nvarchar(5)  
)  
RETURNS @RtnValue table  
( 

    Id int identity(1,1),  
    Value nvarchar(100)  
)  
AS  
BEGIN  
    While (Charindex(@SplitOn,@List)>0)  
    Begin  

    Insert Into @RtnValue (value)  
    Select  
    Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))  

    Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))  
    End  

    Insert Into @RtnValue (Value)  
    Select Value = ltrim(rtrim(@List))  

    Return  
END 

Пожалуйста, попробуйте.

+0

Это для SQL Server. Он хорошо протестирован в SQL Server Management Studio 2008 R2. –

Смежные вопросы