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

结果:

posted @ 2019-04-12 10:31  致力于工作  阅读(1252)  评论(1)    收藏  举报