这个SQL COALESCE函数如何工作?

时间:2016-07-07 00:25:06

标签: sql coalesce

我正在使用我在网站上找到的一些代码而我无法理解这一点。

   SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, [DATE], 106) + ']', 
           '[' + CONVERT(NVARCHAR, [DATE], 106) + ']')
           FROM    (SELECT DISTINCT [DATE] FROM #DailyReport ) PV  order by [DATE]

返回

  [02 May 2016],[03 May 2016],[04 May 2016],[05 May 2016],[06 May 2016],[08 May 2016],[09 May 2016],[10 May 2016],[11 May 2016],[12 May 2016],[13 May 2016],[15 May 2016],[16 May 2016],[17 May 2016],[18 May 2016],[19 May 2016],[20 May 2016],[22 May 2016],[23 May 2016],[24 May 2016],[25 May 2016],[26 May 2016],[27 May 2016],[29 May 2016],[30 May 2016],[31 May 2016]

但它是如何运作的?我希望我明白我是如何获得所有这些专栏的,为什么有两个专栏?[' + CONVERT(NVARCHAR,[DATE],106)+']'短语。

1 个答案:

答案 0 :(得分:2)

您指出的两个短语只是coalesce()有效。有一种更简单的方法来编写逻辑。也许这有助于解释会发生什么:

SELECT @cols = COALESCE(@cols + ',', '') + '[' + CONVERT(NVARCHAR(255), [DATE], 106) + ']',
FROM (SELECT DISTINCT [DATE] FROM #DailyReport
     ) PV  
ORDER BY [DATE];

在您的情况下,完整连接是COALESCE()的第一个参数,因此需要表达式作为第一个参数。但是,如果那是NULL,则需要再次进行。

注意:当使用VARCHAR()NVARCHAR()或SQL Server中的任何字符类型时,总是包含长度说明符。默认长度因上下文而异,如果默认值不够大,则可能很难追踪错误。