由不同用户运行时,SQL查询中的MAX和COALESCE导致奇怪的结果

问题描述 投票:0回答:2

我有一个SQL Server查询,如果列NULL中至少有一个NULL或存储为PredComplDate的最新日期,则尝试选择NVARCHAR(30)

奇怪的是,当我运行查询时,它会返回正确的结果,但是当我的同事在同一台计算机上运行查询时,它会返回不同的结果。

我保存了当我的同事以不同的名称运行查询时创建的表,并将其与运行查询时创建的表进行比较。一切都是一样的,记录数,数据类型等,但查询的下面部分由于某种原因不返回NULL

SELECT [Reference Number],
    CASE 
        WHEN LEN(Predecessors)>0 AND MAX(COALESCE(PredComplDate,'31/12/2099'))='31/12/2099' THEN NULL
        ELSE MAX(PredComplDate)
    END AS LatestPredComplDate
    FROM mytable33
    GROUP BY [Reference Number],Predecessors

这个查询有什么问题?

mytable33由我创建,mytable22由我的同事创建。当我查询结果相同时:

SELECT Predecessors,[Reference Number], PredRefNo,PredComplDate  FROM mytable22

SELECT Predecessors,[Reference Number], PredRefNo,PredComplDate  FROM mytable33

enter image description here

当我在两个表上运行上述查询时,结果是不同的:

SELECT [Reference Number],
    CASE 
        WHEN LEN(Predecessors)>0 AND MAX(COALESCE(PredComplDate,'31/12/2099'))='31/12/2099' THEN NULL
        ELSE MAX(PredComplDate)
    END AS LatestPredComplDate
    FROM mytable22
    GROUP BY [Reference Number],Predecessors

SELECT [Reference Number],
    CASE 
        WHEN LEN(Predecessors)>0 AND MAX(COALESCE(PredComplDate,'31/12/2099'))='31/12/2099' THEN NULL
        ELSE MAX(PredComplDate)
    END AS LatestPredComplDate
    FROM mytable33
    GROUP BY [Reference Number],Predecessors

enter image description here

预期的结果是NULLLastestPredComplDate

sql-server max coalesce case-when
2个回答
0
投票

也许您可以将两个子句放在窗口函数中,如下所示(如果只是为了清晰起见):

  MAX(CASE WHEN LEN(Predecessors)>0 THEN NULL ELSE PredComplDate END) AS LatestPredComplDate

0
投票

最终,我发现了问题。日期(存储为NVARCHAR)格式是罪魁祸首。如果您再看一下我发布的第一张图片,您可以看到相同的日期有不同的格式。一个是04/12/2019,另一个是4/12/2019。事实证明MAX函数会考虑4/12/2019大于04/12/2019,这会产生不同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.