Выберите имя столбца и значение из таблицы

Если у меня есть следующая таблица в базе данных PostgreSQL:

Col1    Col2    Col3    

A       a       1       
B       b       2       

Есть ли способ получить имя столбца для каждого значения без явного указания имен столбцов? т.е. иметь набор результатов, например:

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

person Chip    schedule 24.09.2013    source источник
comment
Единственный способ сделать это — использовать хранимую функцию с динамическим SQL.   -  person a_horse_with_no_name    schedule 25.09.2013
comment
@a_horse_with_no_name: Возможно, вы забываете о JSON и hstore...   -  person Erwin Brandstetter    schedule 25.09.2013
comment
@ErwinBrandstetter: верно, я всегда забываю, что hstore может превратить что угодно в hstore   -  person a_horse_with_no_name    schedule 25.09.2013


Ответы (2)


Конечно, вы можете написать функцию PL/pgSQL и запросить таблицу каталога pg_attribute себя. Но это намного проще с одним из следующих:

JSON

Функция row_to_json() обеспечивает функциональность, которая идет наполовину. Представлено в Postgres 9.2:

SELECT row_to_json(t, TRUE) FROM tbl t;

Вам вообще не нужно упоминать имена столбцов, функция извлекает их из типа таблицы.

->демонстрация SQLfiddle.

Но вам понадобится json_each_text()< /strong> из 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.

магазин

Однако вы можете сделать то же самое с дополнительным модулем < сильный>хстор. Доступно начиная с 8.4. Установите его один раз с помощью:

CREATE EXTENSION hstore;

Подробности:
Пара "ключ-значение" в PostgreSQL

Запрос:

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

Вот и все.
Опять же, никакого SQLfiddle, так как туда нельзя установить дополнительные модули.

person Erwin Brandstetter    schedule 24.09.2013
comment
Решение JSON сделало именно то, что я искал. - person Chip; 25.09.2013
comment
О, чувак, это так здорово, и именно то, что мне нужно, но я застрял здесь с PSQL 8.4. :( Любые указатели? - person dmn; 10.10.2013

Вы можете получить имена столбцов от читателя в С#

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());
                }
            }
person Toprak    schedule 01.04.2015