与COALESCE

时间:2017-11-14 10:08:49

标签: sql-server sql-order-by coalesce

我有一个T-SQL变量,我使用SELECT操作为其分配值。由于“SELECT”查询可能返回多行,因此我使用COALESCE函数,该函数附加用逗号分隔的所有值。到目前为止,所有好的和查询都按预期运行。但是当我尝试使用order by子句来命令我的值时,只有一行被附加到变量。

为什么在查询2中添加Order By子句会产生与查询1不同的结果?

[结果1]

  

球1,球2,球棒3,球棒1,球棒2

[结果2]

  

蝙蝠1

JS小提琴链接:http://sqlfiddle.com/#!6/8dad1/15

[SQL小提琴] [1]

MS SQL Server 2014架构设置

CREATE TABLE tbl_Trans
([Id] int, [Instrument] varchar(20), [Trans_Type] int, [Quantity] int);

CREATE TABLE tbl_Trans_Type
([Id] int, [Trans_Type] varchar(20));  

INSERT INTO tbl_Trans  ([Id], [Instrument], [Trans_Type], [Quantity])

VALUES  
(1,'Ball 1', 121, 50),
(2,'Ball 2', 121, 20),
(3,'Bat 3', 122, 1000),
(4,'Bat 1', 124, 400),
(5,'Bat 2', 121, 300);


INSERT INTO tbl_Trans_Type  ([Id], [Trans_Type])

VALUES 
(121,'Buy'),
(122,'Sell'),
(123,'ReSell'),
(124,'Rent')

**Query 1**:

DECLARE @ST VARCHAR(500) = NULL
SELECT @ST = COALESCE(@ST+ ',' , '')+Instrument 
FROM tbl_Trans a
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 

SELECT @ST

[结果1]

| Ball 1,Ball 2,Bat 3,Bat 1,Bat 2 |

查询2

DECLARE @ST2 VARCHAR(500) = NULL
SELECT  @ST2 = COALESCE(@ST2+ ',' , '')+Instrument 
FROM tbl_Trans a
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 
ORDER BY IIF(b.Trans_Type='Buy',1,2)

SELECT  @ST2

[结果2]

| Bat 1 |

2 个答案:

答案 0 :(得分:0)

如果你想连接但是要订购,请尝试这个:

SELECT STUFF
(
    (
        SELECT ',' +Instrument 
        FROM tbl_Trans a
        LEFT JOIN tbl_Trans_Type b 
            on a.Trans_Type = b.Id 
        ORDER BY IIF(b.Trans_Type='Buy',1,2)
        FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)')
    ,1
    ,1
    ,''
);

答案 1 :(得分:0)

您所看到的行为是设计上的。在具有ORDER BY子句的查询中使用赋值操作(在此方案中连接)具有未定义的行为。

使用以下查询将行成功转换为逗号分隔值,并使用order by子句

select stuff((select ','+Instrument 
FROM tbl_Trans a
  LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 
ORDER BY IIF(b.Trans_Type='Buy',1,2)
for xml path('')) ,1,1,'')