zoukankan      html  css  js  c++  java
  • sql2005新特性 for xml , outer apply ,多行转成单列方法

    ----分割字符串,并生成临时表,可用于字符串分割,并进行数据库 IN 函数查询 ,如:select * from abc where id in (select * from split('1,2,3',','))
    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

    ——提供多行转换成列的方法

    问题描述:

    无论是在sql 2000 还是在 sql 2005 中,都没有提供字符串的聚合函数, 所以, 当我们在处理下列要求时,会比较麻烦:

    有表tb, 如下:

    id    value

    ----- ------

    1     aa

    1     bb

    2     aaa

    2     bbb

    2     ccc

    需要得到结果:

    id     values

    ------ -----------

    1      aa,bb

    2      aaa,bbb,ccc

    即, group by id, value 的和(字符串相加)

    1. 旧的解决方法

    -- 1. 创建处理函数

    CREATE FUNCTION dbo.f_str(@id int)

    RETURNS varchar(8000)

    AS

    BEGIN

        DECLARE @r varchar(8000)

        SET @r = ''

        SELECT @r = @r + ',' + value

        FROM tb

        WHERE id=@id

        RETURN STUFF(@r, 1, 1, '')

    END

    GO

     

    -- 调用函数

    SELECt id, values=dbo.f_str(id)

    FROM tb

    GROUP BY id

    2. 新的解决方法

    -- 示例数据

    DECLARE @t TABLE(id int, value varchar(10))

    INSERT @t SELECT 1, 'aa'

    UNION ALL SELECT 1, 'bb'

    UNION ALL SELECT 2, 'aaa'

    UNION ALL SELECT 2, 'bbb'

    UNION ALL SELECT 2, 'ccc'

     

    -- 查询处理

    SELECT *

    FROM(

        SELECT DISTINCT

            id

        FROM @t

    )A

    OUTER APPLY(

        SELECT

            [values]= STUFF(REPLACE(REPLACE(

                (

                    SELECT value FROM @t N

                    WHERE id = A.id

                    FOR XML AUTO

                ), '<N value="', ','), '"/>', ''), 1, 1, '')

    )N

     

    /*--结果

    id          values

    ----------- ----------------

    1           aa,bb

    2           aaa,bbb,ccc

     

    (2 行受影响)

    --*/

  • 相关阅读:
    前端攻城狮学习笔记九:让你彻底弄清offset
    jquery在线手册
    阻止元素的默认行为
    JS三元运算符
    坐标系与基本图元(1) ~转载天行健 君子当自强而不息
    坐标系与基本图元~转载天行健 君子当自强而不息
    VS常见错误
    ZigZag Conversion
    指针转换(数组退化为指针的三种情况)
    POJ 1985
  • 原文地址:https://www.cnblogs.com/ourwap/p/2713429.html
Copyright © 2011-2022 走看看