sql 将‘1,2,3,4’转成相应的表,字段分隔表值函数,一行变多行,
2015-08-19 16:10
363 查看
再设计表的时候我们经常遇到这样的情况,字段的值为1,2,3,4
等字符隔开的情况,存的是数字,但是显示的时候是对应的类别,直接上图,清楚明了,
如何想得到
分两步完成,步骤如下:
第一步先创造 一个表值函数,将1,2,3,4 转化为
函数是从网上找来的,代码如下:
create FUNCTION [dbo].[fn_Split](
@String nvarchar (max),
@Delimiter nvarchar (10)
)
RETURNS @ValueTable TABLE ([Value] NVARCHAR(max),[id] int)
BEGIN
DECLARE @NextString nvarchar(max),
@Pos int,
@NextPos int,
@CommaCheck nvarchar(1),
@id int
set @id=1
SET @NextString = ''
SET @CommaCheck = right(@String,1)
SET @String = @String + @Delimiter
SET @Pos = CHARINDEX(@Delimiter,@String)
SET @NextPos = 1
WHILE (@pos <> 0)
BEGIN
SET @NextString = SUBSTRING(@String,1,@Pos - 1)
INSERT INTO @ValueTable ( [Value],[id]) VALUES (@NextString,@id)
SET @String = SUBSTRING(@String,@pos +1,LEN(@String))
SET @NextPos = @Pos
SET @pos = CHARINDEX(@Delimiter,@String)
set @id = @id +1
END
RETURN
END
GO
第二步 创建标量函数 ,这步比较重要,由于这些标量函数也不经常用到,总感觉能实现就是还没想好思路,也就是多行转一行的啦,
代码如下:ALTER FUNCTION [dbo].[GetBiontionName](@nodeId varchar(64))
RETURNS varchar(64)
AS
BEGIN
declare @name varchar(64)
set @name=(select name+',' from GWT_Biont where cast(id as varchar) in (SELECT CAST(value AS INT) FROM dbo.fn_Split(@nodeId, ',')) for xml path('') )
return substring(@name,1,len(@name)-1)
END
GO
这样就大功搞成了
等字符隔开的情况,存的是数字,但是显示的时候是对应的类别,直接上图,清楚明了,
如何想得到
分两步完成,步骤如下:
第一步先创造 一个表值函数,将1,2,3,4 转化为
函数是从网上找来的,代码如下:
create FUNCTION [dbo].[fn_Split](
@String nvarchar (max),
@Delimiter nvarchar (10)
)
RETURNS @ValueTable TABLE ([Value] NVARCHAR(max),[id] int)
BEGIN
DECLARE @NextString nvarchar(max),
@Pos int,
@NextPos int,
@CommaCheck nvarchar(1),
@id int
set @id=1
SET @NextString = ''
SET @CommaCheck = right(@String,1)
SET @String = @String + @Delimiter
SET @Pos = CHARINDEX(@Delimiter,@String)
SET @NextPos = 1
WHILE (@pos <> 0)
BEGIN
SET @NextString = SUBSTRING(@String,1,@Pos - 1)
INSERT INTO @ValueTable ( [Value],[id]) VALUES (@NextString,@id)
SET @String = SUBSTRING(@String,@pos +1,LEN(@String))
SET @NextPos = @Pos
SET @pos = CHARINDEX(@Delimiter,@String)
set @id = @id +1
END
RETURN
END
GO
第二步 创建标量函数 ,这步比较重要,由于这些标量函数也不经常用到,总感觉能实现就是还没想好思路,也就是多行转一行的啦,
代码如下:ALTER FUNCTION [dbo].[GetBiontionName](@nodeId varchar(64))
RETURNS varchar(64)
AS
BEGIN
declare @name varchar(64)
set @name=(select name+',' from GWT_Biont where cast(id as varchar) in (SELECT CAST(value AS INT) FROM dbo.fn_Split(@nodeId, ',')) for xml path('') )
return substring(@name,1,len(@name)-1)
END
GO
这样就大功搞成了
相关文章推荐
- SQL语句构建器类
- sqlalchemy
- mongodb查询数字开头的集合报错
- 使用Kettle抽取MongoDB数据到Oracle
- Using mysql as Nosql ------------- Mysql HandlerSockets使用
- 数据库xxx已打开,并且一次只能有一个用户访问。 (Microsoft SQL Server,错误: 924)
- 清空mysql慢查询日志
- SQL大量数据查询的优化
- mysql general log 查看mysql 执行历史
- mysql学习笔记
- SYS_CONNECT_BY_PATH函数用法 ORACLE
- 数据库function和procedure
- 常用sql语句
- MySQL创建表结构里面的那个长度对于整型的作用
- 用MySQL实现微博关注关系的方案分析
- 提高数据库执行效率的方法(杂记)
- left join加上where条件的困惑 --SQL优化
- Oracle和mysql的一些简单区别
- MySQL检查运行的mysqld服务器是否支持OpenSSL
- 经典SQL语句集锦