来自查询的列名

时间:2014-02-27 16:36:17

标签: sql postgresql

我正在尝试进行查询以从postgresql中的查询结果返回列名列表

e.g。

SELECT column_name 
  FROM ( 
        SELECT table1.* 
          FROM table1 
               LEFT JOIN table2 
                         ON table1.id = table2.tbl1_id
        )

这是可能的

我不想从一张奇异的桌子上找到这些柱子!所以请不要告诉我做

SELECT column_name
  FROM information_schema.columns
 WHERE table_name = 'table1'

4 个答案:

答案 0 :(得分:1)

查询表返回数据。查询信息模式会返回元数据。列名是元数据。

SELECT 'table1', column_name
  FROM information_schema.columns
 WHERE table_catalog = 'database_name'
   AND table_schema  = 'schema_name'
   AND table_name = 'table1'
UNION ALL
SELECT 'table2', column_name
  FROM information_schema.columns
 WHERE table_catalog = 'database_name'
   AND table_schema  = 'schema_name'
   AND table_name = 'table2';

“schema_name”可能是 public 。但是请注意,只要它们位于不同的模式中,您就可以拥有多个具有相同名称的表。 (您可以拥有“public.table1”和“private.table1”。)您还可以在不同的数据库中拥有多个具有相同名称的表。您需要指定所有三个值 - 数据库名称,模式名称,表名称 - 以确保获取正确的数据。

如果我必须在制作中这样做,我可能会输出更多数据。我也可能包括列“ordinal_position”,并对其进行排序。按“ordinal_position”排序将对当前表定义中出现的列名进行排序。

SELECT table_catalog
     , table_schema
     , table_name 
     , column_name
     , ordinal_position
FROM information_schema.columns
WHERE table_catalog = 'sandbox'
  AND table_schema  = 'public'
  AND table_name IN ('table1', 'table2')
ORDER BY table_catalog
       , table_schema
       , table_name
       , ordinal_position;

答案 1 :(得分:0)

也许有一种不太常见的方式,但我认为这应该有效:

create table query_column_sample from (your query where 1=2);
SELECT column_name
  FROM information_schema.columns
 WHERE table_name = 'query_column_sample'

答案 2 :(得分:0)

我能想出的唯一合理方法是做这样的事情。架构位置起到了作用,但我只是发布了基本想法。 SQL在运行时没有反射,除非您去访问元数据表,这是您在这里尝试实现的目标。

SELECT table1.* 
INTO x
      FROM table1 
           LEFT JOIN table2 
                     ON table1.id = table2.tbl1_id LIMIT 0;

select *
from information_schema.columns
where table_Name = 'x';

在午餐时间旅行互联网时也很有趣,我遇到了这个问题。适用于PostgreSQL 8.2.0或更高版本。

https://github.com/theory/colnames/tree/master/test/sql

答案 3 :(得分:0)

我不知道为什么你需要这样做,但可以使用9.3中介绍的一些JSON函数。

SELECT json_object_keys(row_to_json(t)) FROM
 (SELECT * FROM table1
  LEFT JOIN table2 ON table1.id = table2.tbl1_id LIMIT 1) t;

这将为您提供单行返回的每个列的名称。如果没有LIMIT,则会为返回的每一行重复列。如果你想看到返回的值,你可以变得更复杂:

WITH t as
  (SELECT * FROM table1
   LEFT JOIN table2 ON table1.id = table2.tbl1_id LIMIT 1)
SELECT json_data.key, json_data.value
FROM t, json_each_text(row_to_json(t)) AS json_data;

这两个查询都将返回所有列,即使它们的名称相同。如果您只想要一个唯一列名列表,则可以使用hstore:

CREATE EXTENSION hstore; --Create the extension if you need it.

SELECT akeys(hstore(t)) as array_of_columns
FROM
(SELECT * FROM table1
 LEFT JOIN table2 ON table1.id = table2.tbl1id LIMIT 1) t;