使用SQL序号位置表示法的好处?

OMG*_*ies 29 sql sql-server oracle ordinals

背景资料

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

以下是使用Ordinals的示例:

GROUP BY 1, 2
ORDER BY 1, 2
Run Code Online (Sandbox Code Playgroud)

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

问题

我能想到的唯一好处是通过网络发送的数据更少,如果你没有使用存储过程或函数(这使得ordinal用法无论如何都对我来说).我还缺少其他任何好处吗?

泄露

这可能听起来像是一项家庭作业,但它确实是研究办公室每个月提供的教育午餐.他们支付午餐费用,我们必须提供一个感兴趣的小话题.

gbn*_*gbn 30

我用它:

  • 如果您喜欢排除故障
  • 创建没有intellisense的adhoc查询

没有好处.

SQL Server只支持ORDER BY.在其他任何地方,它都是要评估的表达式.

  • hpw 大约当 group by 语句在几十行长度时。在两个地方编码/维护有多有趣?这不是假设:我需要在 Spark 和 Hive Sql 中这样做。是的 - 这是 ansi 标准(因为投影发生在 *after* group by 之后)。但是序数的基本原理现在应该很清楚了。 (3认同)

mat*_*mc3 15

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

select top 1000
  Col_1, Col_18, Col_50, Col_117, *
from
  TableWithTonsOfCols
order by
  1, 4 desc, 3
Run Code Online (Sandbox Code Playgroud)

如果我说order by Col_1, Col_117 desc, Col_50我的查询会barf,因为由于"*"加倍,语句不会知道我打算订购哪些列.不是很常见,但仍然是一个有用的功能.

  • 仅供参考:SQL Server 2005引入了此"barfing"以消除ORDER BY中的歧义. (5认同)

Red*_*ter 6

我的两个用例是:

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

  • 就像我在对 Randy 的回答的评论中提到的那样,您可以在“ORDER BY”中使用列别名。 (4认同)