从表中选择列名称和值

时间:2013-09-24 20:23:00

标签: sql postgresql dynamic-sql hstore

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

Col1    Col2    Col3    

A       a       1       
B       b       2       

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

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

2 个答案:

答案 0 :(得分:5)

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

JSON

函数row_to_json()提供了一半的功能。 Postgres引入 9.2

SELECT row_to_json(t, TRUE) FROM tbl t;

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

->SQLfiddle demo.

但是你需要来自Postgres 9.3 json_each_text()才能一路走下去:

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

但是,您可以对additional module hstore执行相同的操作。自 8.4 以来可用。使用以下命令安装一次:

CREATE EXTENSION hstore;

详细说明:
Key value pair in PostgreSQL

查询:

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

就是这样 同样,没有SQLfiddle,因为那里无法安装其他模块。

答案 1 :(得分:0)

您可以在c#

中从阅读器获取列名
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());
                }
            }