繁体   English   中英

查询中的列名

[英]Column names from query

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

例如

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'

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

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.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;

也许有一种更简单的方法,但是我认为这应该可行:

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

我能想到的唯一合理的方法是做这样的事情。 模式位置参与其中,但我只是发布基本概念。 除非您去命中元数据表,否则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

我不知道为什么您需要这样做,但是可以使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM