【问题标题】:Refer to a column by its number (index)通过列号(索引)引用列
【发布时间】:2014-07-06 07:19:30
【问题描述】:

我想使用列的索引(数字)执行选择。我试过了:

select 1 from "user"
select '1' from "user"

但他们没有做我期望的事情。

【问题讨论】:

  • 他们当然不会,因为他们分别选择了值 1 和 '1'。
  • 虽然这可能不是字面上的正确,但您必须假设表列没有固定的顺序,因此这样的请求定义不明确。如果您需要这个,您的结构似乎需要重新考虑。

标签: sql postgresql select postgresql-9.2


【解决方案1】:

在 PostgreSQL 中有几种方法可以做到这一点。最简单的(我认为)是创建一个“功能”。深入研究 PG 手册以获取工作示例。这很容易。您可以从各种语言中进行选择。这里的行是针对 pl/pgsql 但你会明白的:

首先,您从系统目录中检索列名,执行如下操作:

attname := select distinct attname from pg_attribute,pg_class where attrelid = pg_class.oid and attnum = 1 and pg_class.relname='user';

然后你把它连接成一个 SQL 语句:

EXECUTE 'SELECT ' || attname || ' FROM ...

【讨论】:

    【解决方案2】:

    当我需要 FIRST 列(而且我不知道列名)时,我会这样做:

    SELECT uno FROM _your_table_ as t(uno);
    

    只需为表和列使用别名!..

    如果你真的需要数字 1,你可以这样写:

    SELECT "1" FROM _your_table_ as t("1");
    

    双引号......丑陋,但有效!!!!

    【讨论】:

    【解决方案3】:

    你不能在 postgres 中这样做。选择文字(例如1 或'1')只会返回其值。唯一允许此类索引的地方是 order by 子句,即使在那里,它们也与表中列的顺序无关,而是在选择列表中:

    SELECT   col1, col2, col3
    FROM     my_table
    ORDER BY 1
    

    编辑:
    一个警告是将order by <some index> 与select * 结合使用,这看起来好像索引与表中列的顺序有关。但是,* 首先扩展为包含所有列,然后才应用order by 子句。所以最终,它确实引用了select 列表,而不是表的实际结构。

    EDIT2:
    正如@klin 提到的,postgres 的group by 子句也允许索引:

    SELECT   col1, COUNT(*)
    FROM     my_table
    GROUP BY 1
    

    【讨论】:

    • 如果一列没有标题怎么办,那我该如何选择呢?
    • @Alex 你能举一个这种情况的具体例子吗?
    • 它在任何ORDER BY 中都很有用,如果按复杂而冗长的表达式进行排序,它实际上可以带来很大的好处。
    • 索引也可以用在GROUP BY子句中。
    • 这是一个很好的回应,说明性的,但它是不正确的。可以使用别名。就像@BernardoJerez 在另一个答案中所说的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2021-07-23
    • 2018-04-05
    • 2019-11-27
    相关资源
    最近更新 更多