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我不同意。你的回答错了,所以我投了反对票。只要我愿意监视答案,如果更新为正确答案,则删除否决票,就可以了。即使如此