【问题标题】:sql select column via column number/index/position instead of column namesql 通过列号/索引/位置而不是列名选择列
【发布时间】:2016-01-11 09:03:02
【问题描述】:

如何通过列号/索引/位置而不是列名来查询选择列?

到目前为止,这不起作用:

SELECT 1,2,3,4,5,6,7 from table_1
Union 
SELECT 1,2,3,4,5,6,7 from table_2

【问题讨论】:

  • 您使用的是哪个 dbms?不要标记未涉及的产品...
  • 理想情况下,您不需要。列应按名称引用。如果某些事情导致表中列的“顺序”发生变化,它不应该导致现有查询中断(如果顺序甚至是明确定义的,这取决于特定的数据库产品)

标签: mysql sql postgresql sqlite postgresql-9.1


【解决方案1】:

如果数据库支持公用表表达式(除了 MySQL),您可以为列指定新名称:

WITH cte(c1, c2, c3, c4, c5, c6, c7) AS (
    SELECT * FROM table_1
    UNION
    SELECT * FROM table_2
)
SELECT c1, c2, c3, c4, c5, c6, c7 FROM cte;

但是,这仅在您可以使用 SELECT * 时才有效,因此两个表必须具有相同的已知列数。

在 MySQL 中,您可以使用带有列名的视图:

CREATE VIEW v(c1, c2, c3, c4, c5, c6, c7) AS SELECT ...;

【讨论】:

    【解决方案2】:

    我不知道您使用的是哪个 dbms,但我很确定它无法做到,即使有可能,我也不建议这样做。 这不会为您节省很多时间,我猜这只是来自懒惰,但是将来如果有人在您的工作上工作,他将不会理解任何事情。此外,如果您需要更改其中一列/删除或添加,您将把自己带入一团糟。我的建议 - 使用全名

    【讨论】:

    • 完全同意,只有当你不想让其他人理解你的脚本时,请不要这样做。正如我们建议的列名,变量名应该不是简单的 a 或您要使用的数字
    【解决方案3】:

    只需 UNION SELECTS。 UNION 已经按照您想要的方式行事。它忽略联合行中的列名,然后使用第一个参数中的列名作为结果的列名。

    SELECT * from table_1
    Union 
    SELECT * from table_2
    

    MySQL 5.7 Reference Manual 13.2.9.3 UNION Syntax

    第一个 SELECT 语句中的列名用作返回结果的列名。在每个 SELECT 语句的相应位置列出的选定列应具有相同的数据类型。 (例如,第一个语句选择的第一列应该与其他语句选择的第一列具有相同的类型。)

    标准 SQL 具有 UNION CORRESPONDING,它将第二个表的列重新排序为相同(指定)的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2022-11-12
      • 2021-10-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多