首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用例接用例

用例接用例
EN

Stack Overflow用户
提问于 2019-04-17 10:18:42
回答 5查看 353关注 0票数 1

我当时正在读一本sql书,其中一个问题是:

针对Sales.Customers表编写一个查询,该表为每个客户返回客户ID和区域。按区域对输出中的行进行排序,具有最后(在非空值之后)为空标记排序的.Note,即the中空标记的默认排序行为是先排序(在非空值之前)。

答案是:

代码语言:javascript
复制
SELECT custid, region
FROM Sales.Customers
ORDER BY
 CASE WHEN region IS NULL THEN 1 ELSE 0 END, region;

我可以理解这种想法,但仍然很困惑,例如,让我们使用= 9来记录:因为custid 9有一个空区域,所以在使用cstatement返回1的情况下,查询如下:

代码语言:javascript
复制
ORDER BY 1, region

相当于:

代码语言:javascript
复制
ORDER BY custid, region  --because custid is the first column

那么,为什么缓冲器9不是在custid 10之前(输出中的第二个记录)?这不是需要先按垫子定货吗,所以9是在10点之前?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-04-17 10:59:18

所以这个问题就像 按1,区域排序

不,这是错误的。表达式CASE WHEN region IS NULL THEN 1 ELSE 0 END按行计算;1是值而不是列位置。ORDER BY中的列位置只能指定为文字而不能指定为表达式。所以这个:

代码语言:javascript
复制
custid    region
8         NULL
9         NULL
10        BC
42        BC
45        CA

变成:

代码语言:javascript
复制
custid    region    case...
8         NULL      1
9         NULL      1
10        BC        0
42        BC        0
45        CA        0

排序的结果可以是:

代码语言:javascript
复制
custid    region    case...
10        BC        0
42        BC        0
45        CA        0
8         NULL      1
9         NULL      1

或者:

代码语言:javascript
复制
custid region case...
42     BC     0
10     BC     0
45     CA     0
9      NULL   1
8      NULL   1
票数 0
EN

Stack Overflow用户

发布于 2019-04-17 10:58:07

你的解释是不正确的。1是一个简单的数字,而不是列引用。

该查询相当于:

代码语言:javascript
复制
SELECT custid, region
FROM (SELECT c.*,
             (CASE WHEN region IS NULL THEN 1 ELSE 0 END) as region_is_null
      FROM Sales.Customers c
     ) c
ORDER BY region_is_null, region;

这是ORDER BY中关于数字的一个重要区别。这句话:

代码语言:javascript
复制
ORDER BY 1

引用第一列。然而,

代码语言:javascript
复制
ORDER BY 1 + 0

是一个简单的数字表达式,它返回常量1 --并将导致Server中的一个错误(它不允许ORDER BY中的常量)。

票数 1
EN

Stack Overflow用户

发布于 2019-04-17 10:21:25

您可以在下面尝试--在您的情况下,0将先被接受,然后是1,因此您需要更改值的顺序,或者如果您不想更改值,则可以执行desc顺序。

代码语言:javascript
复制
SELECT custid, region
FROM Sales.Customers
ORDER BY
 CASE WHEN region IS NULL THEN 0 ELSE 1 END, region
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55725300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档