1. 程式人生 > >SQL 中拆分由逗號分割的欄位為多個欄位

SQL 中拆分由逗號分割的欄位為多個欄位

測試準備

建立表並填充資料

USE [zws]
GO
/****** Object:  Table [dbo].[a]    Script Date: 2018/5/3 16:28:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[a](
[barcode] [varchar](50) NULL,
[hardness] [varchar](50) NULL
) ON [PRIMARY]


GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[a] ([barcode], [hardness]) VALUES (N'20180503', N'14,12,11')
INSERT [dbo].[a] ([barcode], [hardness]) VALUES (N'20180502', N'11,12')
INSERT [dbo].[a] ([barcode], [hardness]) VALUES (N'20180501', N'10')
INSERT [dbo].[a] ([barcode], [hardness]) VALUES (N'20180504', N'11,12,13,14')
INSERT [dbo].[a] ([barcode], [hardness]) VALUES (N'20180505', N'11,12,13,14,15')

INSERT [dbo].[a] ([barcode], [hardness]) VALUES (N'2018050', NULL)

分割語句一:(該語句有問題,會過濾掉沒有分隔符的資料)

 with s as(
 SELECT a.barcode,a.hardness+',' as 'hardness',CHARINDEX(',',a.hardness) as STA,CHARINDEX(',', a.hardness) - 1 AS LENS FROM dbo.a a
  UNION ALL
  SELECT 
    s.barcode,s.hardness, CHARINDEX(',',s.hardness, STA + 1) AS STA, CHARINDEX(',',s.hardness, STA + 1) - STA - 1 AS LENS
  FROM s AS s
  WHERE STA <> 0
 )


 select *,SUBSTRING(s.hardness,STA - LENS, LENS) as 'new_hardness'
 from s  
 where  STA<>0

 order by s.barcode,STA

分割語句二:

 with s as(
 SELECT a.barcode,a.hardness as 'hardness',CHARINDEX(',',a.hardness) as STA,CHARINDEX(',', a.hardness) - 1 AS LENS FROM dbo.a a
  UNION ALL
  SELECT 
    s.barcode,s.hardness, CHARINDEX(',',s.hardness, STA + 1) AS STA, CHARINDEX(',',s.hardness, STA + 1) - STA - 1 AS LENS
  FROM s AS s
  WHERE STA <> 0
 )


 select *,SUBSTRING(s.hardness,case when STA=0 then abs(LENS) else STA - LENS end, case when LENS<0 then abs(LENS)+10 else LENS end) as 'new_hardness'
 from s  


 order by s.barcode,case when STA=0 then abs(LENS) else STA  end