22,210
社区成员
发帖
与我相关
我的任务
分享
---------------------------------
-- Author: htl258(Tony)
-- Date : 2009-07-07 23:39:33
---------------------------------
--> 生成测试数据表-tb
if not object_id('tb') is null
drop table tb
Go
Create table tb([id] int,[actor] nvarchar(255))
Insert tb
select 1,'郑元畅 林依晨 赵咏华 章柏翰' union all
select 2,'路 飞 卓 洛 奈 美 乌索普 山 治 乔 巴' union all
select 3,'乌索普 林依晨' union all
select 4,'下野纮'
Go
--Select * from tb
-->SQL查询如下:
;with t as
(
select
rn=row_number() over(order by id),
演员= substring(replace(a.[actor],' ',','), b.number, charindex(',', replace(a.[actor],' ',',') + ',', b.number) - b.number)
from tb a,master..spt_values b
where b.type='p'
and substring(',' + replace(a.[actor],' ',','),b.number,1) = ','
) ,t1 as
(
select rn2=(row_number() over(order by rn)-1)/2,* from t where len(演员)=1
), t2 as
(
select distinct 演员=ltrim((select ' '+演员 from t1 where rn2=a.rn2 for xml path(''))) from t1 a
union
select 演员 from t where len(演员)<>1
)
select id=row_number() over(order by 演员),* from t2
/*
id 演员
-------------------- --------------------------------
1 林依晨
2 路 飞
3 奈 美
4 乔 巴
5 山 治
6 乌索普
7 下野纮
8 章柏翰
9 赵咏华
10 郑元畅
11 卓 洛
(11 行受影响)
*/
IF OBJECT_ID('c') IS NOT NULL
DROP TABLE c
SELECT TOP 1000 id = IDENTITY(int, 1, 1) INTO c FROM syscolumns a, syscolumns b
select id = IDENTITY(int, 1, 1),* into ##
from(
SELECT distinct SUBSTRING(Aa.actor, B.id, CHARINDEX(',', Aa.actor + ',', B.id) - B.id) as value
FROM (select id,actor=REPLACE(actor,' ',',') from tb ) Aa, c B
WHERE SUBSTRING(',' + Aa.actor, B.id, 1) = ',' )r
go
--这部分实现的是单字的字段 组合成 双字 中间代空格的名字
select value from (
select case when len(value)=1 then value+' '+(select value from ## where id=#.id+1) else value end as value
from ## # )t where LEN(value)<=3
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([id] INT,[actor] NVARCHAR(250))
Go
INSERT INTO tb
SELECT 1,'郑元畅 林依晨 赵咏华 章柏翰' UNION ALL
SELECT 2,'路飞 卓洛 奈 美 乌索普 山治 乔巴' UNION ALL
SELECT 3,'乌索普 林依晨' UNION ALL
SELECT 4,'下野纮'
GO
--这部实现的是字段的分离和去重复 效果如下
/*
1 林依晨
2 路飞
3 美
4 奈
5 乔巴
6 山治
7 乌索普
8 下野纮
9 章柏翰
10 赵咏华
11 郑元畅
12 卓洛
*/
IF OBJECT_ID('c') IS NOT NULL
DROP TABLE c
SELECT TOP 1000 id = IDENTITY(int, 1, 1) INTO c FROM syscolumns a, syscolumns b
select id = IDENTITY(int, 1, 1),* into ##
from(
SELECT distinct SUBSTRING(Aa.actor, B.id, CHARINDEX(',', Aa.actor + ',', B.id) - B.id) as value
FROM (select id,actor=REPLACE(actor,' ',',') from tb ) Aa, c B
WHERE SUBSTRING(',' + Aa.actor, B.id, 1) = ',' )r
go
--这部分实现的是单字的字段 组合成 双字 中间代空格的名字
select id = IDENTITY(int, 1, 1),* into ##### from (
select case when len(value)=1 then value+' '+(select value from ## where id=#.id+1) else value end as value
from ## #) #### where LEN(value)<=3
go
--显示效果
select * from #####
/*
1 林依晨
2 路飞
3 美 奈
4 乔巴
5 山治
6 乌索普
7 下野纮
8 章柏翰
9 赵咏华
10 郑元畅
11 卓洛
*/
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([id] INT,[actor] NVARCHAR(250))
Go
INSERT INTO tb
SELECT 1,'郑元畅 林依晨 赵咏华 章柏翰' UNION ALL
SELECT 2,'路飞 卓洛 奈 美 乌索普 山治 乔巴' UNION ALL
SELECT 3,'乌索普 林依晨' UNION ALL
SELECT 4,'下野纮'
GO
IF OBJECT_ID('c') IS NOT NULL
DROP TABLE c
SELECT TOP 1000 id = IDENTITY(int, 1, 1) INTO c FROM syscolumns a, syscolumns b
select id = IDENTITY(int, 1, 1),* into ##
from(
SELECT distinct SUBSTRING(Aa.actor, B.id, CHARINDEX(',', Aa.actor + ',', B.id) - B.id) as value
FROM (select id,actor=REPLACE(actor,' ',',') from tb ) Aa, c B
WHERE SUBSTRING(',' + Aa.actor, B.id, 1) = ',' )r
go
select id = IDENTITY(int, 1, 1),* into ##### from (
select case when len(value)=1 then value+' '+(select value from ## where id=#.id+1) else value end as value
from ## #) #### where LEN(value)<=3
go
select * from #####
/*
1 林依晨
2 路飞
3 美 奈
4 乔巴
5 山治
6 乌索普
7 下野纮
8 章柏翰
9 赵咏华
10 郑元畅
11 卓洛
*/