sql通过列号/索引/位置选择列而不是列名

时间:2016-01-11 09:03:03

标签: mysql sql postgresql sqlite postgresql-9.1

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

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

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

3 个答案:

答案 0 :(得分:3)

如果数据库支持公共表表达式(除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 ...;

答案 1 :(得分:2)

我不知道你使用的是哪个dbms,但我很确定它无法完成,即使有可能,我也不会建议这样做。 这不会为你节省很多时间,我猜它只是来自懒惰,但将来如果有人会为你的工作工作,他就不会理解一件事。另外,如果您需要更改其中一列/ drop或添加,您将导致自己陷入混乱。我的建议 - 使用全名

答案 2 :(得分:1)

选择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,它将第二个表的列重新排序为相同(指定)的顺序。