32

背景资料

序数位置表示法,AKA ordinals,是基于子句中列列表中的列顺序的列简写SELECT,而不是列名或列别名。该ORDER BY子句通常支持,一些数据库(MySQL 3.23+、PostgreSQL 8.0+)也支持该GROUP BY子句的语法。

这是使用序数的示例:

GROUP BY 1, 2
ORDER BY 1, 2

使用起来不好,因为它会使查询变得脆弱——如果列顺序发生变化,则需要更新序数,否则您的查询将不会返回您认为的结果。GROUP BY如果这些位置的列包含在聚合中,则很可能在使用时会出现错误...

问题

我能想到的唯一好处是通过网络发送的数据更少,如果您不使用存储过程或函数(这使得序数使用对我来说毫无意义)。我还缺少其他好处吗?

4

6 回答 6

37

我会用它:

  • 如果您喜欢故障排除
  • 在没有智能感知的情况下创建即席查询

没有任何好处。

无论如何,SQL Server 仅支持 ORDER BY。在其他任何地方,它都是要评估的表达式。

于 2010-02-24T17:43:27.587 回答
15

很多时候,当我查询一个包含很多列的表时(在 ad-hoc-land 中只是为了数据探索......我永远不会为 PROD 环境编写这样的代码)我会做这样的事情来获取我关心的字段紧靠在一起:

select top 1000
  Col_1, Col_18, Col_50, Col_117, *
from
  TableWithTonsOfCols
order by
  1, 4 desc, 3

如果我说order by Col_1, Col_117 desc, Col_50我的查询会出错,因为由于“ * ”加倍,语句不知道我打算按哪些列排序。不是很常见,但仍然是一个有用的功能。

于 2010-07-09T01:29:07.923 回答
6

我的两个用例是:

  • 我很着急不想打字,所以我用序数。我总是将其转换为列名以供任何非临时使用
  • 我订购的那一列是一个冗长的CASE陈述;我没有为子句重新输入CASE语句ORDER BY,而是使用保持它DRY的序数。有一些方法可以解决这个问题,例如,使用 CTE、子查询或视图,但我经常发现序数是最简单的解决方案。
于 2010-02-12T16:00:30.057 回答
2

我现在倾向于使用内联视图:

select col_a, count(*) from
  (select case ...... end col_a from ...)
group by col_a
order by col_a;

但在它们成为有效语法之前的日子里,它确实有助于重新输入该列的全文。使用棘手的功能,您可能会在 SELECT 和 ORDER BY 中的值之间出现差异,例如

select ltrim(col_name,'0123456789')
from table
order by ltrim(col_name,'123456789')

SELECT 中的“0”表示您没有按您选择的内容进行排序。

于 2010-02-12T21:01:50.023 回答
1

我有一个查询生成算法 - SQL 是自动生成的。使用序数意味着我可以引用生成的字段而无需再次获取字段名称。用户可以通过从屏幕上的列表中选择来引用表格中的字段名称。只要我使列表与 sql 相对应,如果 SELECT 项也是序数,我永远不需要知道字段名称。

内存说这曾经是 1970 年代后期的 SQL 标准

于 2016-06-29T10:46:12.523 回答
0

如果我没记错的话,Microsoft 在 SQL Server 的未来版本中将不推荐使用您所描述的序数。我可能是错的,但我认为情况就是这样。我一直喜欢在某些情况下使用它们,因为当您处理包含较长查询的派生列时,它涉及的输入更少。

于 2010-02-12T15:58:19.333 回答