T-SQL COALESCE 没有 return 不同的值

T-SQL COALESCE does not return distinct values

此查询 returns Zip 的重复值 - 我认为不应该。 例如:@pivotColumns returns 以下列表,即使 zip 的子查询具有 "distinct Zip"。 我假设 QUOTENAME 可能无法正常工作以返回唯一值列表?我想要没有重复的邮政编码

DECLARE   @PivotColumns AS NVARCHAR(MAX)

SELECT   @PivotColumns = COALESCE (@PivotColumns + ',','') + QUOTENAME([Zip])
FROM [dbo].[PivotStoreZip]
Where Zip in (
               Select distinct Zip 
               From PivotStoreZip 
               Where ZIP in ('39401','39402', '39406','39465','39475')
             )

print (@PivotColumns)

print (@PivotColumns) returns 下面的列表,例如 [39401] 重复:

[39401],[39406],[39465],[39475],[39401],[39402],[39406],[39465],[39475]

in里的distinct没用。 in 不会生成重复项,这对外部查询没有影响。

我想你想做的是:

select  @PivotColumns = COALESCE (@PivotColumns + ',','') + QUOTENAME([Zip])
from (select distinct Zip 
      from PivotStoreZip 
      where ZIP in ('39401', '39402', '39406', '39465', '39475')
     ) z;

我应该注意到这在实践中有效。我不是 100% 确定 Microsoft 保证此代码在一般情况下有效。

您可以尝试在子查询中使用 distinct 来删除重复的 Zip 而不是 where 条件

SELECT   @PivotColumns = COALESCE (@PivotColumns + ',','') + QUOTENAME([Zip])
FROM (
    Select distinct Zip 
    From PivotStoreZip 
    Where ZIP in ('39401','39402', '39406','39465','39475')
) t1

子查询中的 distinct 是不够的,就好像你在 [dbo].[PivotStoreZip] 中有重复项一样,它们会从你的主查询中弹出,所以也只需在其中添加一个 distinct:

DECLARE   @PivotColumns AS NVARCHAR(MAX)

SELECT   @PivotColumns = distinct COALESCE (@PivotColumns + ',','') + QUOTENAME([Zip])
FROM [dbo].[PivotStoreZip]
Where Zip in (
               Select distinct Zip 
               From PivotStoreZip 
               Where ZIP in ('39401','39402', '39406','39465','39475')
             )

打印(@PivotColumns)