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,首先想到的就是使用游标,在这里我也是将游标写在了一个函数里,如下:

    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

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

    CREATE FUNCTION GetTitle ( @NoAll NVARCHAR(2000) )
    SELECT
        NoAll,
        dbo.GetTitle(No) AS TitleAll
    FROM
        Table2

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

  • 相关阅读:
    说说委托是个什么东西,以及委托有什么用
    Fedora/Centos使用dnf/yum为Firefox安装Flash,两行命令超简单
    Debian中的NVIDIA显卡驱动安装——超简单,一行命令
    对象、字段、属性、方法、成员、接口各自含义
    C#中的字段与属性的区别及属性的作用
    C#的foreach遍历循环和隐式类型变量
    依赖注入的通俗讲解,设计低耦合的系统
    群晖moments提示错误代码117的解决方案
    群晖数据库错误解决
    解决终端录制工具asciinema 的错误
  • 原文地址:https://www.cnblogs.com/oec2003/p/1111059.html
Copyright © 2011-2022 走看看