2

如果我在 PostgreSQL 数据库中有下表:

Col1    Col2    Col3    

A       a       1       
B       b       2       

有没有办法在不明确指定列名的情况下获取每个值的列名?即有一个结果集,如:

Col1    A
Col1    B
Col2    a
Col2    b
Col3    1
Col3    2
4

2 回答 2

8

当然,您可以编写一个 PL/pgSQL 函数并pg_attribute自己查询目录表。但是使用以下方法之一会容易得多:

JSON

该功能row_to_json()提供了半途而废的功能。Postgres 9.2引入:

SELECT row_to_json(t, TRUE) FROM tbl t;

您根本不必提及列名,该函数从表类型派生它们。

->SQLfiddle 演示。

但是你需要json_each_text()从 Postgres 9.3一路走下去:

SELECT json_each_text(row_to_json(t)) FROM tbl t;

要获得像您显示的排序顺序:

SELECT (json_each_text(row_to_json(t))).*
FROM   tbl t
ORDER  BY 1, 2;

(目前尚不清楚您要如何准确排序。)
未经测试。SQLfiddle 还没有提供 Postgres 9.3。

hstore

但是,您可以对附加模块hstore执行相同操作。从8.4开始可用。安装一次:

CREATE EXTENSION hstore;

详细信息:
PostgreSQL 中的键值对

询问:

SELECT (each(hstore(t))).*
FROM   tbl t
ORDER  BY 1,2;

就这样。
同样,没有 SQLfiddle,因为不能在那里安装其他模块。

于 2013-09-24T21:36:45.520 回答
0

您可以在 c# 中从 reader 获取列名

string CONNECTION_QUERY = "SELECT * FROM FINANCE_PAYMENTS";
            SqlCommand comand = new SqlCommand(CONNECTION_QUERY,onnection);
            SqlDataReader reader = comand.ExecuteReader();

            while (reader.Read())
            {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    //this line will give you Column name and value
                    JO.Add(reader.GetName(i),reader[i].ToString());
                }
            }
于 2015-04-01T01:12:53.477 回答