我正在尝试进行查询以从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'
答案 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或更高版本。
答案 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;