zoukankan      html  css  js  c++  java
  • Sql中分隔字串>查询>组合字串

     

    最近在工作遇到一个数据库查询的问题,大概如下:表Table1中有字段No和Title,每一个No对应一个Title,表Table2中有NoAll字段,NoAll字段的value是No的组合,以逗号隔开,如"111,222,333",现在要查询Table2,根据NoAll将其中的每一个No所对应的Title查询出来也以逗号分隔显示,如:"oec2003,oec2004,oec2004"。表定义如下:

    CREATE TABLE Table1
    (
    No VARCHAR(5),
    Title VARCHAR(20)
    )


    CREATE TABLE Table2
    (
    NoAll VARCHAR(100)
    )

    INSERT INTO Table1 VALUES('111','oec2003')
    INSERT INTO Table1 VALUES('222','oec2004')
    INSERT INTO Table1 VALUES('333','oec2005')

    INSERT INTO Table2 VALUES('111,222,333')

    因为NoAll是用逗号分隔的,所以要查询其中的每一个No就要将NoAll进行拆分,就想到了写一个split函数,如下:

    CREATE FUNCTION Split
    (
    @SourceSql varchar(8000),
    @StrSeprate varchar(10)
    )
    RETURNS @temp TABLE(F1 VARCHAR(100))
    AS
    BEGIN
    DECLARE @i INT
    SET @SourceSql=rtrim(ltrim(@SourceSql))
    SET @i=charindex(@StrSeprate,@SourceSql)
    WHILE @i>=1
    BEGIN
    INSERT @temp VALUES(left(@SourceSql,@i-1))
    SET @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
    SET @i=charindex(@StrSeprate,@SourceSql)
    END
    IF @SourceSql<>''
    INSERT @temp VALUES(@SourceSql)
    RETURN
    END

    将NoAll拆分了后返回的是一个Table,Table中的每一行是一个No值,要查出每个No对应的Title就要遍历这个Table,首先想到的就是使用游标,在这里我也是将游标写在了一个函数里,如下:


    CREATE FUNCTION GetTitle(@NoAll NVARCHAR(2000))
    RETURNS NVARCHAR(2000)
    AS
    BEGIN
    DECLARE @result VARCHAR(2000)
    SET @result=''
    DECLARE getTitle CURSOR
    FOR
    SELECT * FROM split(@NoAll,',')
    OPEN getTitle

    DECLARE @No SYSNAME


    FETCH FROM getTitle INTO @No
    WHILE @@fetch_status=0
    BEGIN

    SET @result=@result+(SELECT Title FROM Table1 WHERE No=@No)+','
    FETCH FROM getTitle INTO @No
    END
    CLOSE getTitle
    SET @result= substring(@result,0,len(@result))

    DEALLOCATE getTitle

    RETURN @result
    END

    最后执行下面语句出想要的结果,如下:

    SELECT
    NoAll,
    dbo.GetTitle(No) AS TitleAll
    FROM
    Table2


    我这个方法只是将功能实现了,肯定还有更好的方法,欢迎大家讨论

    联盟快卖 商人,生意人,待创业人士在此可以共赢互利 期待你的加入 群号:140809277
  • 相关阅读:
    paip.提升安全性时间判断
    paip.提升安全性本机硬件绑定
    paip.提升性能服务器环境及编程语言架构选择
    paip.提升用户体验提示语
    paip.提升效率输入框不能粘贴的问题
    paip.银联支付接口订单号uuid算法
    paip.Net Framework各个版本的功能不同总结
    Answer 3.0 .NET开源网站功能API说明
    Paip.YXSHOP易想商场功能模块说明
    paip.提升效率文件搜索工具总结
  • 原文地址:https://www.cnblogs.com/yexinw/p/2538015.html
Copyright © 2011-2022 走看看