How to split a comma-separated value to columns

后端 未结 30 3956
刺人心
刺人心 2020-11-21 04:38

I have a table like this

Value   String
-------------------
1       Cleo, Smith

I want to separate the comma delimited string into two colu

相关标签:
30条回答
  • 2020-11-21 04:56
    select distinct modelFileId,F4.*
    from contract
    cross apply (select XmlList=convert(xml, '<x>'+replace(modelFileId,';','</x><x>')+'</x>').query('.')) F2
    cross apply (select mfid1=XmlNode.value('/x[1]','varchar(512)')
    ,mfid2=XmlNode.value('/x[2]','varchar(512)')
    ,mfid3=XmlNode.value('/x[3]','varchar(512)')
    ,mfid4=XmlNode.value('/x[4]','varchar(512)') from XmlList.nodes('x') F3(XmlNode)) F4
    where modelFileId like '%;%'
    order by modelFileId
    
    0 讨论(0)
  • 2020-11-21 04:57

    I think PARSENAME is the neat function to use for this example, as described in this article: http://www.sqlshack.com/parsing-and-rotating-delimited-data-in-sql-server-2012/

    The PARSENAME function is logically designed to parse four-part object names. The nice thing about PARSENAME is that it’s not limited to parsing just SQL Server four-part object names – it will parse any function or string data that is delimited by dots.

    The first parameter is the object to parse, and the second is the integer value of the object piece to return. The article is discussing parsing and rotating delimited data - company phone numbers, but it can be used to parse name/surname data also.

    Example:

    USE COMPANY;
    SELECT PARSENAME('Whatever.you.want.parsed',3) AS 'ReturnValue';
    

    The article also describes using a Common Table Expression (CTE) called ‘replaceChars’, to run PARSENAME against the delimiter-replaced values. A CTE is useful for returning a temporary view or result set.

    After that, the UNPIVOT function has been used to convert some columns into rows; SUBSTRING and CHARINDEX functions have been used for cleaning up the inconsistencies in the data, and the LAG function (new for SQL Server 2012) has been used in the end, as it allows referencing of previous records.

    0 讨论(0)
  • 2020-11-21 04:57

    You can use a table-valued function STRING_SPLIT, which is available only under compatibility level 130. If your database compatibility level is lower than 130, SQL Server will not be able to find and execute the STRING_SPLIT function. You can change a compatibility level of the database using the following command:

    ALTER DATABASE DatabaseName SET COMPATIBILITY_LEVEL = 130
    

    Syntax

    SELECT * FROM STRING_SPLIT ( string, separator )
    

    see documentation here

    0 讨论(0)
  • 2020-11-21 04:58

    I think this is cool

    SELECT value,
        PARSENAME(REPLACE(String,',','.'),2) 'Name' ,
        PARSENAME(REPLACE(String,',','.'),1) 'Sur Name'
    FROM table WITH (NOLOCK)
    
    0 讨论(0)
  • 2020-11-21 04:58

    This worked for me

    CREATE FUNCTION [dbo].[SplitString](
        @delimited NVARCHAR(MAX),
        @delimiter NVARCHAR(100)
    ) RETURNS @t TABLE ( val NVARCHAR(MAX))
    AS
    BEGIN
        DECLARE @xml XML
        SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
        INSERT INTO @t(val)
        SELECT  r.value('.','varchar(MAX)') as item
        FROM  @xml.nodes('/t') as records(r)
        RETURN
    END
    
    0 讨论(0)
  • 2020-11-21 04:58

    mytable:

    Value  ColOne
    --------------------
    1      Cleo, Smith
    

    The following should work if there aren't too many columns

    ALTER TABLE mytable ADD ColTwo nvarchar(256);
    UPDATE mytable SET ColTwo = LEFT(ColOne, Charindex(',', ColOne) - 1);
    --'Cleo' = LEFT('Cleo, Smith', Charindex(',', 'Cleo, Smith') - 1)
    UPDATE mytable SET ColTwo = REPLACE(ColOne, ColTwo + ',', '');
    --' Smith' = REPLACE('Cleo, Smith', 'Cleo' + ',')
    UPDATE mytable SET ColOne = REPLACE(ColOne, ',' + ColTwo, ''), ColTwo = LTRIM(ColTwo);
    --'Cleo' = REPLACE('Cleo, Smith', ',' + ' Smith', '') 
    

    Result:

    Value  ColOne ColTwo
    --------------------
    1      Cleo   Smith
    
    0 讨论(0)
提交回复
热议问题