将逗号值分隔为单个值

时间:2019-08-11 12:42:11

标签: sql-server sql-server-2012

我需要在SQL Server中分隔列

表:列分隔

Error: ImportError: file line 2: No module named Qt #

基于上述数据,我希望输出如下:

CREATE TABLE [dbo].[columnsseparates](
    [id] [varchar](50) NULL,
    [name] [varchar](500) NULL
) 
INSERT [dbo].[columnsseparates] ([id], [name]) VALUES (N'1,2,3,4', N'abc,xyz,mn')
GO
INSERT [dbo].[columnsseparates] ([id], [name]) VALUES (N'4,5,6', N'xy,yz')
GO
INSERT [dbo].[columnsseparates] ([id], [name]) VALUES (N'7,100', N'yy')
INSERT [dbo].[columnsseparates] ([id], [name]) VALUES (N'101', N'oo,yy')

GO

如何在SQL Server中实现此任务?

2 个答案:

答案 0 :(得分:2)

在列中存储非原子值是表示应该规范化架构的标志。


使用PARSENAME(最多4个逗号分隔值)的简单方法:

SELECT DISTINCT s.id, s.name
FROM [dbo].[columnsseparates]
CROSS APPLY(SELECT REVERSE(REPLACE(id,',','.')) id,REVERSE(REPLACE(name, ',','.')) name) sub
CROSS APPLY(VALUES (REVERSE(PARSENAME(sub.id,1)), REVERSE(PARSENAME(sub.name,1))),
                   (REVERSE(PARSENAME(sub.id,2)), REVERSE(PARSENAME(sub.name,2))),
                   (REVERSE(PARSENAME(sub.id,3)), REVERSE(PARSENAME(sub.name,3))),
                   (REVERSE(PARSENAME(sub.id,4)), REVERSE(PARSENAME(sub.name,4))) 
         ) AS s(id, name)
ORDER BY s.id;

db<>fiddle demo

输出:

+------+------+
| id   | name |
+------+------+
|      |      |
|      | yy   |
|   1  | abc  |
| 100  |      |
| 101  | oo   |
|   2  | xyz  |
|   3  | mn   |
|   4  |      |
|   4  | xy   |
|   5  | yz   |
|   6  |      |
|   7  | yy   |
+------+------+

答案 1 :(得分:0)

如果您有四个以上的值,那么您将使用可以返回序数值的字符串分隔符。我在这里使用delimitedsplit8k_LEAD

WITH Ids AS(
       SELECT cs.id,
              cs.name,
              DS.ItemNumber,
              DS.Item
       FROM dbo.columnsseparates cs
            CROSS APPLY dbo.DelimitedSplit8K_LEAD (cs.id,',') DS),
Names AS (
       SELECT cs.id,
              cs.name,
              DS.ItemNumber,
              DS.Item
       FROM dbo.columnsseparates cs
            CROSS APPLY dbo.DelimitedSplit8K_LEAD (cs.[name],',') DS)
SELECT I.Item AS ID,
       N.Item AS [Name]
FROM Ids I
     FULL OUTER JOIN Names N ON I.id = N.id
                            AND I.ItemNumber = N.ItemNumber
ORDER BY CASE WHEN I.Item IS NULL THEN 1 ELSE 0 END,
         TRY_CONVERT(int,I.Item);