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 @   致力于工作  阅读(1219)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示