将逗号分隔的值分成不同的行

时间:2019-07-09 01:39:22

标签: sql split

此刻,我的数据看起来像这样,所有3个首选项都用逗号分隔...

Subscriber ID                      Preference
34732632746                      Abc123, abc1234, bcd232

我想复制订户ID并将首选项分成不同的行...像这样:

Subscriber ID                      Preference
34732632746                      Abc123
34732632746                      abc1234 
34732632746                      bcd232 

2 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server 2017,请检查以下查询。

SELECT 
      SubscriberID,Value AS Preference 
FROM @tblName 
    CROSS APPLY STRING_SPLIT(Preference, ',');

如果您使用的是较低版本的SQL Server 2017,请添加拆分字符串功能并在下面的查询中使用。

-----查询------------

SELECT SubscriberID,Item AS Preference from @tbl CROSS APPLY dbo.SplitString(Preference, ',');

-----查询------------

-----功能---------

CREATE FUNCTION [dbo].[SplitString]
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
      Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END

-----功能---------

答案 1 :(得分:0)

您没有指定DBMS产品,但是如果您使用Postgres,则可以使用unnest()string_to_array()

select t.subscriber_id
       p.preference
from the_table t
  cross join lateral unnest(string_to_array(p.preference, ',')) as p(preference);