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

时间:2010-02-12 15:53:47

标签: 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

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

问题

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

披露

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

6 个答案:

答案 0 :(得分:29)

我会用它:

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

没有好处。

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

答案 1 :(得分: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我的查询会barf,因为由于“*”加倍,语句不会知道我打算订购哪些列。不是很常见,但仍然是一个有用的功能。

答案 2 :(得分:3)

我的两个用例是:

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

答案 3 :(得分: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'表示您没有按所选内容进行排序。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

如果我没记错的话,Microsoft将在SQL Server的未来版本中弃用您所描述的序数。我可能错了,但我认为就是这样。我总是喜欢在某些情况下使用它们,因为当你处理包含冗长查询的派生列时,它会减少输入。