表的各字段内容 ,有一个字段内容会有3个|符号分割
字段1 字段2 字段3 字段4 字段5 字段6
a b c d aaa|bb|cc|d e
a b c d aaa|bb|cc|d e
a b c d aaa|bb|cc|d e
a b c d aaa|bb|cc|d e
a b c d aaa|bb|cc|d e
查询后的效果将字段5的内容分别按|取出来显示在不同的字段字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
解决方案 »
- 紧急求助!!(触发器问题)
- 见鬼了 ORDER BY 没有用了。
- sql server 2008 express不能启动,请高手看下错误日志
- 怎样在同一行显示最大值和最小值?
- 请教如何在Recordset中得到某一个值的序号?
- 双表联合查询,一次得到最后结果的SQL语句怎么写?
- 不能连接数据库,提示如下,是怎么回事?如何解决?
- 请教一个数据设计的问题
- 根据日期排除和统计数量
- Format(IIf(Sum([NBR])=0,0,Sum([ANS])/Sum([NBR])),"Percent")在SQLSERVER 中怎样写
- 重装系统后以前用的sql server数据库文件无法删除,需要提供权限,咋整?
- [SQL疑难-求助高手解答-]
-- Author :fredrickhu(小F,向高手学习)
-- Date :2010-06-05 01:58:54
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([字段1] varchar(1),[字段2] varchar(1),[字段3] varchar(1),[字段4] varchar(1),[字段5] varchar(11),[字段6] varchar(1))
insert [tb]
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e'
--------------开始查询--------------------------
select
字段1,
字段2,
字段3,
字段4,
字段5 = PARSENAME(REPLACE(字段5,'|','.'),4), ----替换一下 '.' 因为 parsename 只认 '.'
字段6 = PARSENAME(REPLACE(字段5,'|','.'),3),
字段7 = PARSENAME(REPLACE(字段5,'|','.'),2),
字段8 = PARSENAME(REPLACE(字段5,'|','.'),2),
字段6 as 字段9
from
tb
----------------结果----------------------------
/* 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
---- ---- ---- ---- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ----
a b c d aaa bb cc cc e
a b c d aaa bb cc cc e
a b c d aaa bb cc cc e
a b c d aaa bb cc cc e
a b c d aaa bb cc cc e(5 行受影响)*/
-- Author :fredrickhu(小F,向高手学习)
-- Date :2010-06-05 01:58:54
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([字段1] varchar(1),[字段2] varchar(1),[字段3] varchar(1),[字段4] varchar(1),[字段5] varchar(11),[字段6] varchar(1))
insert [tb]
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e'
--------------开始查询--------------------------
select
字段1,
字段2,
字段3,
字段4,
字段5 = PARSENAME(REPLACE(字段5,'|','.'),4), ----替换一下 '.' 因为 parsename 只认 '.'
字段6 = PARSENAME(REPLACE(字段5,'|','.'),3),
字段7 = PARSENAME(REPLACE(字段5,'|','.'),2),
字段8 = PARSENAME(REPLACE(字段5,'|','.'),1),
字段6 as 字段9
from
tb
----------------结果----------------------------
/* 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
---- ---- ---- ---- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ----
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e(5 行受影响)
*/
--各种字符串分函数if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_splitSTR]
GO--3.2.1 循环截取法
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END
GO
'aaabb|bbcc|ccdd|dee'
'abb|bcc|cdd|deed'
'ccccc|aaa|bbbbbb|ssss'
insert [tb]
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e'
select [字段1],[字段2],[字段3],[字段4]
,[字段5]=convert(xml,'<root><row>'+replace([字段5],'|','</row><row>')+'</row></root>').value('(root/row)[1]','nvarchar(10)')
,[字段6]=convert(xml,'<root><row>'+replace([字段5],'|','</row><row>')+'</row></root>').value('(root/row)[2]','nvarchar(10)')
,[字段7]=convert(xml,'<root><row>'+replace([字段5],'|','</row><row>')+'</row></root>').value('(root/row)[3]','nvarchar(10)')
,[字段8]=convert(xml,'<root><row>'+replace([字段5],'|','</row><row>')+'</row></root>').value('(root/row)[4]','nvarchar(10)')
,[字段6]
from [tb]字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段6
---- ---- ---- ---- ---------- ---------- ---------- ---------- ----
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e(5 行受影响)
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([字段1] varchar(1),[字段2] varchar(1),[字段3] varchar(1),[字段4] varchar(1),[字段5] varchar(11),[字段6] varchar(1))
insert [tb]
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e' union all
select 'a','b','c','d','aaa|bb|cc|d','e'
--1 加个序号,避免重复
select id=identity(int,1,1),* into #t from tb
--2 分解字段5
Select
a.id,a.字段1,a.字段2,a.字段3,a.字段4,
字段5=substring(a.字段5,b.number,charindex('|',a.字段5+'|',b.number)-b.number) ,a.字段6,
b.number
into #t1
from
#t a join master..spt_values b
ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.字段5)
where
substring('|'+a.字段5,b.number,1)='|'--3 加小组内的序号,避免重复
select *,id1=(select count(1) from #t1 where id=t.id and number<=t.number)
into #t2
from #t1 t--4 合并显示
declare @sql varchar(8000)
set @sql = 'select 字段1,字段2,字段3,字段4 '
select @sql = @sql + ' , max(case id1 when ' + ltrim(id1) + ' then 字段5 else null end) [字段' +ltrim(id1+4) + ']'
from (select distinct id1 from #t2) as a
set @sql = @sql + ',字段6 as 字段'+(select ltrim(count(distinct id1)+5) from #t2)+' from #t2 group by id,字段1,字段2,字段3,字段4,字段6'
exec(@sql)--结果
/*
字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
---- ---- ---- ---- ----------- ----------- ----------- ----------- ----
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e
a b c d aaa bb cc d e(所影响的行数为 5 行)警告: 聚合或其他 SET 操作消除了空值。
*/