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

Posted

技术标签:

【中文标题】使用 SQL 序数位置表示法的好处?【英文标题】:Benefits Of Using SQL Ordinal Position Notation? 【发布时间】:2011-01-16 05:15:12 【问题描述】:

背景资料

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

以下是使用序数的示例:

GROUP BY 1, 2
ORDER BY 1, 2

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

问题

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

【问题讨论】:

您多久更改一次列的顺序?为什么需要这样做? @FrustratedWithFormsDesigner:在客户的要求下,任何事情都可以并且将会改变。序数是一个维护问题——如果你把这个工作交给不熟悉 SQL 的人,他们可能会错过这个符号,然后乐趣就开始了。对我来说,性能的优先级略高于维护,因为它可能不会是我进行更新。 【参考方案1】:

我会用它:

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

没有任何好处。

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

【讨论】:

Hpw 关于当 group by 语句在几十行长度时。在两个地方编码/维护有多有趣?这不是假设:我需要在 Spark 和 Hive Sql 中这样做。是的 - 这是 ansi 标准(因为投影发生在 after group by)。但是序数的基本原理现在应该很清楚了。【参考方案2】:

当我查询一个包含很多列的表时(在 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 我的查询会出错,因为由于“*”加倍,该语句不知道我打算按哪些列排序。不是很常见,但仍然是一个有用的功能。

【讨论】:

仅供参考:SQL Server 2005 引入了这种“barfing”以消除 ORDER BY 中的歧义。【参考方案3】:

我的两个用例是:

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

【讨论】:

就像我在对 Randy 的回答的评论中提到的那样,您可以使用 ORDER BY 中的列别名。【参考方案4】:

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

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”表示您没有按您选择的内容进行排序。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

上帝,我希望如此。我没有遇到任何此类文档,如果您碰巧有链接,我会很高兴。对于计算列,我会参考 ORDER BY 中的列别名 - 虽然通常无法帮助 GROUP BY... 不推荐,但不反对:msdn.microsoft.com/en-us/library/ms188385.aspx

以上是关于使用 SQL 序数位置表示法的好处?的主要内容,如果未能解决你的问题,请参考以下文章

基数序数与标称数

Python练习1

1、FMEA中RPN值的R、P、N分别代表啥? 2、RPN就是风险序数吗?

序数效用理论

表示与描述

记初次调试CNN做文本向量表示