【问题标题】:SQL String aggregation returns different results based on location of variablesSQL 字符串聚合根据变量的位置返回不同的结果
【发布时间】:2016-03-28 22:39:47
【问题描述】:

我的代码:

if object_id('tempdb..#t1') is not null drop table #t1

create table #t1 (ID int, name varchar(10))

insert into #t1 values (1,'2'), (6,'2'), (6,'2'), (1,'4')

DECLARE @CHARS VARCHAR(100) = ''
SELECT @CHARS = @CHARS + name + ', ' -- <---CODE OF INTEREST
FROM #t1

这将返回2, 2, 2, 4,。一切都很好。

但是,当我将上面的代码更改为先附加逗号和空格时:

DECLARE @CHARS VARCHAR(100) = ''
SELECT @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
FROM #t1

SELECT @CHARS

它返回, , , , 2224。它不应该返回, 2, 2, 2, 4吗?

【问题讨论】:

    标签: sql sql-server string-aggregation


    【解决方案1】:

    第二个公式的逻辑是:对于每条记录,它将字符串附加到@CHARS的右侧

    假设你有

    insert into #t1 values (1,'2'), (6,'3'), (6,'4'), (1,'5')
    

    为了更清楚

    对于第一行,它返回", 2"

    对于第二行,您的@CHARS 将是", " + ", 2" + "3"

    对于第三行,@CHARS 为", , 23",因此将@CHARS 设置为", " + ", , 23" + "4"

    试试下面的查询看看发生了什么:

    DECLARE @CHARS VARCHAR(100) = ''
    SELECT top 1 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
    FROM #t1
    
    print @CHARS
    go
    
    Result: , 2
    --------------------------
    DECLARE @CHARS VARCHAR(100) = ''
    SELECT top 2 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
    FROM #t1
    
    print @CHARS
    go
    
    Result: , , 23
    ----------------------
    DECLARE @CHARS VARCHAR(100) = ''
    SELECT top 3 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
    FROM #t1
    
    print @CHARS
    go
    Result: , , , 234
    

    【讨论】:

    • 你完全正确!这很有意义!不敢相信我自己没有解决这个问题>:/谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2021-12-06
    • 2017-09-14
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多