使用SQL Ordinal Position Notation的好处是什么?

7 浏览
0 Comments

使用SQL Ordinal Position Notation的好处是什么?

序数位置表示法,也称为序数,是一种基于列在“SELECT”子句中的列顺序的列缩写,而不是基于列名或列别名。通常在“ORDER BY”子句中支持,一些数据库(MySQL 3.23+,PostgreSQL 8.0+)也支持在“GROUP BY”子句中使用该语法。

以下是使用序数的示例:

“GROUP BY 1, 2

ORDER BY 1, 2”

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

问题是,我只能想到一个好处,就是在不使用存储过程或函数(对我来说,序数用法无关紧要)的情况下,可以减少要发送的数据量。还有其他我忽略的好处吗?

0
0 Comments

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

在上述内容中,提到了两种情况下使用SQL序数位置表示法的原因:

1. 当我匆忙且不想输入时,我会使用序数位置表示法。但是在任何非临时使用的情况下,我总会将其转换为列名。

2. 我正在排序的列是一个较长的CASE语句;与其在ORDER BY子句中重新输入CASE语句,我使用序数位置表示法来保持DRY(Don't Repeat Yourself)。虽然有其他方法可以解决这个问题,比如使用公共表表达式(CTEs)、子查询或视图,但我通常发现序数位置表示法是最简单的解决方案。

除此之外,还提到了可以在ORDER BY中使用列别名。

使用SQL序数位置表示法的好处是可以在不输入列名或重复代码的情况下进行快速查询和排序。

0
0 Comments

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

在查询具有大量列的表时(在临时探索数据的情况下...我永远不会在生产环境中这样编码),我经常这样做,以便将我关心的字段放在一起:

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引入了这种“出错”来消除ORDER BY中的歧义。

问题的原因:当在查询中使用“*”通配符时,如果同时使用具体列名和列位置进行排序,会导致歧义。

解决方法:使用SQL序数位置表示法来明确指定排序顺序。

文章整理如下:

在进行查询时,如果涉及到具有大量列的表,使用SQL序数位置表示法来指定排序顺序可以避免歧义的问题。当在查询中使用“*”通配符时,如果同时使用具体列名和列位置进行排序,会导致语句无法确定按哪些列进行排序。为了解决这个问题,可以使用SQL序数位置表示法来明确指定排序顺序。例如,可以通过在ORDER BY子句中使用列的位置来指定排序顺序,如order by 1, 4 desc, 3。这样,即使使用了通配符“*”,查询语句也能够正确地按照指定的排序顺序进行排序。SQL Server 2005引入了这种“出错”机制,以消除ORDER BY中的歧义。尽管这种情况并不常见,但在查询具有大量列的表时,使用SQL序数位置表示法可以提供一种简单而有效的解决方案。

0
0 Comments

使用SQL序号表示法的好处是什么?

在使用SQL时,有时候我们需要使用序号来表示列的位置。这种情况通常发生在以下两种情况下:

1. 如果你喜欢解决问题

2. 在没有智能感知的情况下创建adhoc查询

然而,这种方法并没有任何优势。SQL Server只支持在ORDER BY语句中使用序号。在其他地方,它只是一个需要计算的表达式。

那么,当GROUP BY语句有几十行长度时怎么办?在两个地方编码/维护这样的语句有多有趣?这不是一个假设的情况:我在Spark和Hive SQL中确实需要这样做。是的 - 这是ANSI标准(因为投影发生在GROUP BY之后)。但是,现在序号的理由应该是清楚的了。

使用SQL序号表示法的好处是可以方便地表示列的位置,尤其在处理复杂的GROUP BY语句时。然而,这种方法在其他方面并没有优势,因为SQL Server只支持在ORDER BY语句中使用序号。

0