我有一个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
当我在两个表上运行上述查询时,结果是不同的:
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
预期的结果是NULL
为LastestPredComplDate
也许您可以将两个子句放在窗口函数中,如下所示(如果只是为了清晰起见):
MAX(CASE WHEN LEN(Predecessors)>0 THEN NULL ELSE PredComplDate END) AS LatestPredComplDate
最终,我发现了问题。日期(存储为NVARCHAR)格式是罪魁祸首。如果您再看一下我发布的第一张图片,您可以看到相同的日期有不同的格式。一个是04/12/2019
,另一个是4/12/2019
。事实证明MAX
函数会考虑4/12/2019
大于04/12/2019
,这会产生不同的结果。