字符串截取問題


我有一個字段,里面存的是字符串:
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);
S(1);M(1);XL(1);
S(1);M(1);XL(1);
S(0.8);M(1);XL(1.2);
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);
S(1);M(1);XL(1);
S(0.8);M(1);XL(1.2);

想達到的效果:
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); 
S M L XL XXL  XXXL
0.5 0.9 1 1.1 1.2         1.5

長度不是固定的,請大家幫幫忙,謝謝!

6 个解决方案

#1


你的數據是怎么存的,你寫成 insert 語句形式出來;

#2


你是想一條條拆還是整個表拆合計 S 總共有 ..?

#3



 ;WITH s(ID,st) AS (
  SELECT  1,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
  SELECT  2,'S(1);M(1);XL(1);' UNION ALL
  SELECT  3,'S(1);M(1);XL(1);' UNION ALL
  SELECT  4,'S(0.8);M(1);XL(1.2);' UNION ALL
  SELECT  5,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
  SELECT  6,'S(1);M(1);XL(1);' UNION ALL
  SELECT  7,'S(0.8);M(1);XL(1.2);' 
 )
 SELECT s.st,j.* FROM s
 CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.st,';','</n><n>')+'</n>'))) n(x)
 CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
 CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
 WHERE len(c.e)>0
/*
st k kk
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); S 0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); M 0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); L 1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XL 1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXL 1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXXL 1.5
S(1);M(1);XL(1); S 1
S(1);M(1);XL(1); M 1
S(1);M(1);XL(1); XL 1
S(1);M(1);XL(1); S 1
S(1);M(1);XL(1); M 1
S(1);M(1);XL(1); XL 1
S(0.8);M(1);XL(1.2); S 0.8
S(0.8);M(1);XL(1.2); M 1
S(0.8);M(1);XL(1.2); XL 1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); S 0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); M 0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); L 1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XL 1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXL 1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXXL 1.5
S(1);M(1);XL(1); S 1
S(1);M(1);XL(1); M 1
S(1);M(1);XL(1); XL 1
S(0.8);M(1);XL(1.2); S 0.8
S(0.8);M(1);XL(1.2); M 1
S(0.8);M(1);XL(1.2); XL 1.2
*/

#4


USE [jiepuzai]
GO
/****** Object:  Table [dbo].[訂單信息表]    Script Date: 08/26/2016 10:08:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[訂單信息表](
[訂單ID] [nvarchar](100) NOT NULL,
[訂單號] [nvarchar](100) NULL,
[款式編號] [nvarchar](50) NULL,
[計划交期類別] [nvarchar](100) NULL,
[開發計划類別] [nvarchar](100) NULL,
[款式類別] [nvarchar](100) NULL,
[訂單數] [int] NULL,
[打樣次數] [int] NULL,
[打樣日期] [date] NULL,
[客戶] [nvarchar](100) NULL,
[尺碼組] [nvarchar](100) NULL,
[尺碼] [nvarchar](100) NULL,
[推算尺碼] [nvarchar](max) NULL,
[布色] [nvarchar](max) NULL,
[印花工藝] [nvarchar](max) NULL,
[打樣件數] [int] NULL,
[計划成本] [float] NULL,
[用色總數] [int] NULL,
[用料重量] [float] NULL,
[原料總價] [float] NULL,
[打樣評語] [nvarchar](max) NULL,
[備注] [nvarchar](max) NULL,
[跟單員] [nvarchar](255) NULL,
[收到AI] [date] NULL,
[收到SO布] [date] NULL,
[收到位置] [date] NULL,
[SO送出日] [date] NULL,
[SO核可日] [date] NULL,
[收到PP樣布] [date] NULL,
[PP送出日] [date] NULL,
[PP核可日] [date] NULL,
[PP樣衣] [date] NULL,
[大貨位置版] [date] NULL,
[計划交期] [date] NULL,
[工藝圖片] [nvarchar](100) NULL,
[打樣圖片] [nvarchar](100) NULL,
[是否已審核] [varchar](50) NULL,
[是否停用] [varchar](50) NULL,
[操作者] [nvarchar](100) NULL,
[下單時間] [datetime] NULL,
[是否已完成] [nvarchar](10) NULL,
 CONSTRAINT [PK_訂單信息表] PRIMARY KEY CLUSTERED 
(
[訂單ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[訂單信息表] ([訂單ID], [訂單號], [款式編號], [計划交期類別], [開發計划類別], [款式類別], [訂單數], [打樣次數], [打樣日期], [客戶], [尺碼組], [尺碼], [推算尺碼], [布色], [印花工藝], [打樣件數], [計划成本], [用色總數], [用料重量], [原料總價], [打樣評語], [備注], [跟單員], [收到AI], [收到SO布], [收到位置], [SO送出日], [SO核可日], [收到PP樣布], [PP送出日], [PP核可日], [PP樣衣], [大貨位置版], [計划交期], [工藝圖片], [打樣圖片], [是否已審核], [是否停用], [操作者], [下單時間], [是否已完成]) VALUES (N'010e9bf85cac4705a7cad2ab93f2971b', N'20160818201911', N'888888', N'計划交期1', N'開發計划類A', N'復古', 234, 3, CAST(0xC33B0B00 AS Date), N'李思思', N'尺碼組3', N'L', N'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);', N'333', N'', 3, 2, 2, 0.0536, 0.11149, N'第三次打樣', N'禾禾禾', N'李四', CAST(0xC13B0B00 AS Date), CAST(0xC43B0B00 AS Date), CAST(0xCA3B0B00 AS Date), CAST(0xC43B0B00 AS Date), CAST(0xCB3B0B00 AS Date), CAST(0xC93B0B00 AS Date), CAST(0xC93B0B00 AS Date), CAST(0xCA3B0B00 AS Date), CAST(0xCB3B0B00 AS Date), CAST(0xCF3B0B00 AS Date), CAST(0x5B950A00 AS Date), N'b70710568e32437a834fa5c8587b7bb8', N'7181c2cd7664492e91599082a3da3dc0', N'否', N'否', N'admin', CAST(0x0000A66800E09688 AS DateTime), N'否')
INSERT [dbo].[訂單信息表] ([訂單ID], [訂單號], [款式編號], [計划交期類別], [開發計划類別], [款式類別], [訂單數], [打樣次數], [打樣日期], [客戶], [尺碼組], [尺碼], [推算尺碼], [布色], [印花工藝], [打樣件數], [計划成本], [用色總數], [用料重量], [原料總價], [打樣評語], [備注], [跟單員], [收到AI], [收到SO布], [收到位置], [SO送出日], [SO核可日], [收到PP樣布], [PP送出日], [PP核可日], [PP樣衣], [大貨位置版], [計划交期], [工藝圖片], [打樣圖片], [是否已審核], [是否停用], [操作者], [下單時間], [是否已完成]) VALUES (N'378c06c4415d4c679869151d3d18ffc1', N'20160819182621', N'3333', N'計划交期1', N'開發計划類C', N'純色', 33, 1, CAST(0xC33B0B00 AS Date), N'李思思', N'尺碼組1', N'M', N'S(1);M(1);XL(1);', N'33', N'333', 3, 1, 2, 0.0231, 0.09247, N'', N'222', N'張三', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, CAST(0xC33B0B00 AS Date), N'', N'', N'否', N'否', N'101', CAST(0x0000A66701305BA0 AS DateTime), N'否')
/****** Object:  Default [DF_訂單信息表_計划成本]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_計划成本]  DEFAULT ((0)) FOR [計划成本]
GO
/****** Object:  Default [DF_訂單信息表_是否已審核]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_是否已審核]  DEFAULT ('否') FOR [是否已審核]
GO
/****** Object:  Default [DF_訂單信息表_是否停用]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_是否停用]  DEFAULT ('否') FOR [是否停用]
GO
/****** Object:  Default [DF_訂單信息表_是否已完成]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_是否已完成]  DEFAULT ('否') FOR [是否已完成]
GO

#5


引用 3 樓 ch21st 的回復:

 ;WITH s(ID,st) AS (
  SELECT  1,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
  SELECT  2,'S(1);M(1);XL(1);' UNION ALL
  SELECT  3,'S(1);M(1);XL(1);' UNION ALL
  SELECT  4,'S(0.8);M(1);XL(1.2);' UNION ALL
  SELECT  5,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
  SELECT  6,'S(1);M(1);XL(1);' UNION ALL
  SELECT  7,'S(0.8);M(1);XL(1.2);' 
 )
 SELECT s.st,j.* FROM s
 CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.st,';','</n><n>')+'</n>'))) n(x)
 CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
 CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
 WHERE len(c.e)>0
/*
st k kk
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); S 0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); M 0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); L 1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XL 1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXL 1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXXL 1.5
S(1);M(1);XL(1); S 1
S(1);M(1);XL(1); M 1
S(1);M(1);XL(1); XL 1
S(1);M(1);XL(1); S 1
S(1);M(1);XL(1); M 1
S(1);M(1);XL(1); XL 1
S(0.8);M(1);XL(1.2); S 0.8
S(0.8);M(1);XL(1.2); M 1
S(0.8);M(1);XL(1.2); XL 1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); S 0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); M 0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); L 1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XL 1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXL 1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5); XXXL 1.5
S(1);M(1);XL(1); S 1
S(1);M(1);XL(1); M 1
S(1);M(1);XL(1); XL 1
S(0.8);M(1);XL(1.2); S 0.8
S(0.8);M(1);XL(1.2); M 1
S(0.8);M(1);XL(1.2); XL 1.2
*/


方法可行,如果換成表如何改呢? 比方表名:訂單信息表,需要拆分的字段名:推算尺碼   先謝謝,一會給分!

#6



 SELECT s.*,j.*  FROM 訂單信息表 as s
 CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.推算尺碼,';','</n><n>')+'</n>'))) n(x)
 CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
 CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
 WHERE len(c.e)>0


再進一步


--放入臨時表,否則語句太啰嗦
 SELECT s.*,j.* INTO  #t1 FROM 訂單信息表 as s
 CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.推算尺碼,';','</n><n>')+'</n>'))) n(x)
 CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
 CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
 WHERE len(c.e)>0
--將進行轉置,有變回原訂單行數,將尺碼變為列
 DECLARE @cols NVARCHAR(1000),@sql NVARCHAR(max)
 SELECT  @cols=isnull(@cols+',','')+k FROM (SELECT DISTINCT k FROM #t1) t  --取出所有訂單涉及到的尺碼
 SET @sql='SELECT * FROM #t1
 PIVOT(MAX(kk) FOR k IN ('+@cols+')) n'
 EXEC(@sql)

/*
下單時間 是否已完成 L M S XL XXL XXXL
2016-08-20 13:37:42.000 否 1 0.9 0.5 1.1 1.2 1.5
2016-08-19 18:28:08.000 否 NULL 1 1 1 NULL NULL
*/


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com