Sql server SQL视图中空值的排序顺序不正确
我正在尝试返回设计一个Sql server SQL视图中空值的排序顺序不正确,sql-server,sql-view,Sql Server,Sql View,我正在尝试返回设计一个SQL视图,该视图按升序返回表中的TOP 3记录,并将表中的NULL值视为最大值,这样,如果有三条以上的记录,我就可以丢弃前3个结果中的NULL值 我能够使用下面的查询成功地完成它,但由于其行为不正常的原因,w.r.t第三条记录是,如果我表中的第三条和第四条记录相同,那么我的视图将返回一个空值,即第三条记录,这有点奇怪 例如,我在表中有一个名为“代码>等级< /代码>的列,值为代码> 23、45、19、35、35 < /代码> 当我运行视图时,它应该按升序返回前3个值,即
SQL视图
,该视图按升序返回表中的TOP 3
记录,并将表中的NULL
值视为最大值,这样,如果有三条以上的记录,我就可以丢弃前3个结果中的NULL值
我能够使用下面的查询成功地完成它,但由于其行为不正常的原因,w.r.t第三条记录是,如果我表中的第三条和第四条记录相同,那么我的视图将返回一个空值,即第三条记录,这有点奇怪
例如,我在表中有一个名为“代码>等级< /代码>的列,值为代码> 23、45、19、35、35 < /代码>
当我运行视图时,它应该按升序返回前3个值,即19,23,35
,但由于某些原因,我的查询返回19,23,空
,如果我的第三条记录为35,则查询正常工作,即如果等级
为23,45,19,35,40,则查询正常工作并返回19,23,35
我的问题如下
CREATE VIEW [dbo].[test]
AS
SELECT distinct
CC.Grades,
CC.Term,
FROM CanadianCrudes CC
CROSS APPLY (SELECT TOP 3 Grades
FROM CanadianCrudes iCC
WHERE CC.Term = iCC.Term
ORDER BY case
when iCC.Grades is null
then 1
else 0 end, iCC.Grades asc ) iCC
假设你的分数有一个上限,可以在你的orderby中使用isnull,并为null出现设置默认的高值,当两个值具有相同的排名时设置平局断路器(例如35)
e、 g
假设你的分数有一个上限,可以在你的orderby中使用isnull,并为null出现设置默认的高值,当两个值具有相同的排名时设置平局断路器(例如35)
e、 g
假设你的分数有一个上限,可以在你的orderby中使用isnull,并为null出现设置默认的高值,当两个值具有相同的排名时设置平局断路器(例如35)
e、 g
假设你的分数有一个上限,可以在你的orderby中使用isnull,并为null出现设置默认的高值,当两个值具有相同的排名时设置平局断路器(例如35)
e、 g
重要提示
您可能在视图的定义中有有序的结果,但当您实际从视图中选择时,它不能保证有序的结果
在您的情况下,它将为每个等级选择前3个值,但不保证结果、返回和显示的顺序,除非您在从视图中选择时在select语句中使用order By
测试数据
DECLARE @TABLE TABLE(ID INT)
INSERT INTO @TABLE VALUES
(1), (2),(3),(5),(NULL),(NULL)
查询
SELECT *
FROM @TABLE
ORDER BY CASE WHEN ID IS NULL THEN 100000 ELSE ID END ASC
结果集
╔══════╗
║ ID ║
╠══════╣
║ 1 ║
║ 2 ║
║ 3 ║
║ 5 ║
║ NULL ║
║ NULL ║
╚══════╝
重要提示
您可能在视图的定义中有有序的结果,但当您实际从视图中选择时,它不能保证有序的结果
在您的情况下,它将为每个等级选择前3个值,但不保证结果、返回和显示的顺序,除非您在从视图中选择时在select语句中使用order By
测试数据
DECLARE @TABLE TABLE(ID INT)
INSERT INTO @TABLE VALUES
(1), (2),(3),(5),(NULL),(NULL)
查询
SELECT *
FROM @TABLE
ORDER BY CASE WHEN ID IS NULL THEN 100000 ELSE ID END ASC
结果集
╔══════╗
║ ID ║
╠══════╣
║ 1 ║
║ 2 ║
║ 3 ║
║ 5 ║
║ NULL ║
║ NULL ║
╚══════╝
重要提示
您可能在视图的定义中有有序的结果,但当您实际从视图中选择时,它不能保证有序的结果
在您的情况下,它将为每个等级选择前3个值,但不保证结果、返回和显示的顺序,除非您在从视图中选择时在select语句中使用order By
测试数据
DECLARE @TABLE TABLE(ID INT)
INSERT INTO @TABLE VALUES
(1), (2),(3),(5),(NULL),(NULL)
查询
SELECT *
FROM @TABLE
ORDER BY CASE WHEN ID IS NULL THEN 100000 ELSE ID END ASC
结果集
╔══════╗
║ ID ║
╠══════╣
║ 1 ║
║ 2 ║
║ 3 ║
║ 5 ║
║ NULL ║
║ NULL ║
╚══════╝
重要提示
您可能在视图的定义中有有序的结果,但当您实际从视图中选择时,它不能保证有序的结果
在您的情况下,它将为每个等级选择前3个值,但不保证结果、返回和显示的顺序,除非您在从视图中选择时在select语句中使用order By
测试数据
DECLARE @TABLE TABLE(ID INT)
INSERT INTO @TABLE VALUES
(1), (2),(3),(5),(NULL),(NULL)
查询
SELECT *
FROM @TABLE
ORDER BY CASE WHEN ID IS NULL THEN 100000 ELSE ID END ASC
结果集
╔══════╗
║ ID ║
╠══════╣
║ 1 ║
║ 2 ║
║ 3 ║
║ 5 ║
║ NULL ║
║ NULL ║
╚══════╝
OP想要的是最后一个空值,而不是第一个空值,他很困惑为什么他的代码在他的前三名结果中放置空值。@黑曜凤凰如果答案是错误的,你需要保持冷静,给OP一个机会来纠正它,应该小心地使用向下投票。@M.Ali谢谢,上面的例子很好,但正如我的问题所述,当有两个第三个值时,它会将第三个值返回为NULL。在您的示例中,1 2 3 5 NULL NULL可以正常工作,但当值为1 2 3 3 NULL NULL时,我的视图将返回1 2 NULL,前提是我只需要与您的答案不同的前三个值。@M.Ali即使我的值中没有NULL,如果3号点有多个值,它仍将返回NULL,而且我也能够获得与您相同的结果对我问题中的问题进行了回答。@M.Ali我不同意。你的回答错了,所以我投了反对票。只要我愿意监视答案,如果更新为正确答案,则删除否决票,就可以了。尽管如此,答案仍然是错误的。OP想要的是最后一个空值,而不是第一个空值,并且不明白为什么他的代码在他的前3个结果中设置了空值。@ObsidianPhoenix如果答案是错误的,你需要耐心等待,给OP一个机会来纠正它,应该小心地使用向下投票。@M.Ali谢谢,上面的例子很好,但正如我的问题所述,当有两个第三个值时,它会将第三个值返回为NULL。在您的示例中,1 2 3 5 NULL NULL可以正常工作,但当值为1 2 3 3 NULL NULL时,我的视图将返回1 2 NULL,前提是我只需要与您的答案不同的前三个值。@M.Ali即使我的值中没有NULL,如果3号点有多个值,它仍将返回NULL,而且我也能够获得与您相同的结果对我问题中的问题进行了回答。@M.Ali我不同意。你的回答错了,所以我投了反对票。只要我愿意监视答案,如果更新为正确答案,则删除否决票,就可以了。即使如此