sql server 2008 数据库列值用逗号隔开保存后,需要将其查询为多个列值
需求:

需要的是将上面的表中的name值分别取出来,以列的形式形式展示
如下:

方法:这里是使用函数的方式来实现的,创建该函数
USE [PersonDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE function [dbo].[SplitSubString] ( @Expression varchar(8000), @Delimiter varchar(100), @n int ) returns varchar(8000) as begin declare @p int,@temp varchar(8000); set @p = CharIndex(@Delimiter,@Expression); set @temp = @Expression; if @p > 0 begin set @p = @p + len(@Delimiter) - 1; end declare @i int; set @i = 1; while @i < @n begin set @i = @i + 1; set @Expression = substring (@Expression, @p + 1,len(@Expression) - @p ); set @p = CharIndex(@Delimiter,@Expression); if @p > 0 begin set @p = @p + len(@Delimiter) - 1; end else begin break; end end declare @s varchar(1000); if @p = 0 and @i = @n begin if @n > 1 begin if len(@Expression) < len(@temp) begin set @s=@Expression; end else begin set @s = null; end end else begin set @s=@Expression; end end else if @i = @n begin set @s = substring(@Expression, 1,@p - len(@Delimiter)); end return @s; end GO
使用方式:
SELECT ID, name, classname, dbo.SplitSubString(name,',',1) nama1, dbo.SplitSubString(name,',',2) nama2, dbo.SplitSubString(name,',',3) nama3 FROM dbo.STUDENT_CLASS
说明:直接用这个函数SplitSubString 第一个参数 是需要分割的字段,第二个参数是 中间的分割符号,第三个参数表示的是显示的位置从1开始
但是:列里面的值数量不对齐的话,那么

用上面的查出来的,就会少一个

或者 一个为null值(对于取值这个应该没关系)

所以,这个使用的话,就实际情况而定。
最后附上一个,查询列值中的某个字符的个数sql
select *, len(name)-len(replace(name, ',', ''))+1 '逗号的个数' from STUDENT_CLASS
结果:


浙公网安备 33010602011771号