代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

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

  •  29
  • OMG Ponies  · 技术社区  · 14 年前

    背景资料

    序数位置表示法,又称序数,是基于 SELECT 子句,而不是列名或列别名。共同支持的 ORDER BY 子句,某些数据库(mysql 3.23+,postgresql 8.0+)支持 GROUP BY 条款也一样。

    下面是使用序数的示例:

    GROUP BY 1, 2
    ORDER BY 1, 2
    

    使用它并不好,因为它会使查询变得脆弱—如果列顺序发生更改,则需要更新序号,否则查询将不会返回您认为它会返回的内容。很可能,在 按组 如果这些位置的柱包裹在聚合体中…

    问题

    我能想到的唯一好处是,如果不使用存储过程或函数(不管怎样,对我来说,这使得顺序使用变得毫无意义),可以通过网络发送的数据就更少了。我还缺什么好处吗?

    披露

    这听起来像是一项家庭作业,但实际上是办公室每个月为教育午餐做的研究。他们付午餐费,我们得提供一个感兴趣的小话题。

    6 回复  |  直到 8 年前
        1
  •  29
  •   gbn    14 年前

    我会用它:

    • 如果你喜欢故障排除
    • 创建不带intellisense的临时查询

    没有好处。

    无论如何,SQL Server只支持按顺序排列。在其他任何地方,它都是要计算的表达式。

        2
  •  15
  •   mattmc3    14 年前

    当我查询一个有很多列的表时(在特别的地方只是为了数据探索…我永远不会为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 我的查询会出现错误,因为语句不知道我要按哪些列排序,因为“*”会加倍。不是很常见,但仍然是一个有用的功能。

        3
  •  3
  •   D'Arcy Rittich    14 年前

    我的两个用例是:

    • 我很急,不想打字,所以我用序数。对于任何非临时用途,我总是将此转换为列名
    • 我要订购的专栏很长 CASE 声明;而不是重新键入 案例 对…的陈述 ORDER BY 子句,我使用保留它的序号 DRY . 有很多方法可以解决这个问题,例如使用cte、子查询或视图,但是我经常发现序号是最简单的解决方案。
        4
  •  2
  •   Gary Myers    14 年前

    我现在倾向于使用在线视图:

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

    但在它们成为有效语法之前的几天,它确实帮助重新输入了该列的全文。对于复杂的函数,您有可能在select和order中的值之间出现差异,例如

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

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

        5
  •  1
  •   Perry Sugerman    8 年前

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

    内存说这在70年代后期的sql标准中曾经出现过

        6
  •  0
  •   Randy Minder    14 年前

    如果我没记错的话,在SQL Server的未来版本中,Microsoft不赞成使用您描述的序号。我可能错了,但我想是这样的。我一直喜欢在某些情况下使用它们,因为在处理包含长查询的派生列时,它所涉及的类型较少。