使用SQL Server选择顶部返回的输出与选择*返回的输出不同

问题描述 投票:1回答:3

我试图从数据库中获取基于字母和数字格式的select top n数据。输出必须先按字母排序,然后再按数字排序。

[当我尝试获取所有数据(select *)时,我得到正确的输出:

select nocust, share 
from TB_STOCK
where share = ’BBCA’ 
  and concat(share, nocust) < ‘ZZZZZZZZ’
order by 
    case when nocust like ‘[a-z]%’ then 0 else 1 end


nocust | share
-------+--------
a522   | BBCA
b454   | BBCA
k007   | BBCA
p430   | BBCA
q797   | BBCA
s441   | BBCA
s892   | BBCA
u648   | BBCA
v107   | BBCA
4211   | BBCA
6469   | BBCA
6751   | BBCA

但是当我尝试select top n(例如:前5名)时,我得到的输出与预期的不同(不像select * from table):

select top 5 nocust, share 
from TB_STOCK
where share = ’BBCA’ 
  and concat(share, nocust) < ‘ZZZZZZZZ’
order by 
    case when nocust like ‘[a-z]%’ then 0 else 1 end

nocust | share
-------+--------
k007   | BBCA
b454   | BBCA
a522   | BBCA
p430   | BBCA
q797   | BBCA

我希望错误发生在concat和order by之间,有人可以告诉我如何获得正确的前5个输出,例如:

nocust | share
-------+--------
a522   | BBCA
b454   | BBCA
k007   | BBCA
p430   | BBCA
q797   | BBCA
sql sql-server select sql-order-by concat
3个回答
1
投票

您有一个非常奇怪的ORDER BY-它只能确保在开头带有字母的条目之前对那些以数字开头的条目进行排序-但您实际上是[[NOT根据值本身进行排序。没有特定的ORDER BY表示:无法保证行的排序方式-如您在此处看到的。

您需要将ORDER BY调整为:

ORDER BY CASE WHEN nocust LIKE '[a-z]%' THEN 1 ELSE 0 END, nocust

[NOW

您实际上是按nocust进行订购-现在,我很确定,输出将是相同的]]

1
投票
您的ORDER BY不是稳定的排序;它将数据大致分为两个类别之一,但是没有足够详细地指定如何在类别中对项目进行排序。这意味着在TOP 5表单中,sqlserver可以自由选择数据访问策略,这意味着它可以在找到5行数据后轻松停止,该行的数据使得case when返回0

0
投票
我试图以不同的角度回答这个问题。
© www.soinside.com 2019 - 2024. All rights reserved.