Я довольно плохо знаком с postgresql.
что лучший способ состоит в том, чтобы достигнуть этого?
SELECT get_columns()
FROM table_name;
get_columns()
обеспечит имена столбцов для запроса. Я видел, что люди советовали для использования оператора EXECUTE, но я не мог, получил ту работу.
Позволяет говорят, что существует Тест таблицы со столбцами a, b, c, и я хочу работать
SELECT a,b FROM Test;
SELECT a,c FROM Test;
с именами столбцов, сгенерированными динамично.
В В таком случае я бы использовал функцию PL / pgSQL с курсором .
Поскольку вы используете КОПИРОВАТЬ ИЗ в известную большую таблицу, СОЗДАЙТЕ ФУНКЦИЮ, которая возвращает SETOF bigtable и ВЫБИРАЕТ все столбцы определенного типа, используйте NULL AS fieldname для полей, которые не требуются в этом конкретном случае, например :
# \d SMALL
Table "public.small"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
c | integer |
d | integer |
# \d LARGE
Table "public.large"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
c | integer |
d | integer |
# CREATE OR REPLACE FUNCTION myData()
RETURNS SETOF large LANGUAGE SQL AS $$
SELECT a,
CASE WHEN a = 1
THEN b
ELSE
NULL
END as b,
CASE WHEN a = 2
THEN c
ELSE
NULL
END AS c,
d
FROM small;
$$;
# SELECT * FROM mydata();
# COPY (SELECT * FROM myData()) TO STDOUT;
Очевидно, что SQL может быть не лучшим языком для использования, поэтому PL / PgSQL или PL / Perl (или что-то еще) могут быть подходящими.
Вот как вы получаете имена столбцов в таблице:
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = 'test';
Вы не сможете использовать функцию для создания списка столбцов. И я действительно не думаю, что это лучший способ решения проблемы ... Тем не менее, вы можете сделать это с помощью 8.4 следующим образом:
CREATE OR REPLACE FUNCTION dyn (p_name VARCHAR) RETURNS SETOF ЗАПИСАТЬ КАК $$ DECLARE p_sql TEXT; BEGIN SELECT 'SELECT' || CASE p_name WHEN 'foo 'THEN' col1, col2, col3, col4 ' WHEN' bar 'THEN' col3, col4, col5, col6 ' WHEN' baz 'THEN' col1, col3, col4, col6 'END || 'FROM mytest' INTO p_sql; RETURN QUERY EXECUTE p_sql; END $$ LANGUAGE 'plpgsql';
Использование будет следующим: SELECT * FROM dyn ('foo') AS (один int, два int, три int, четыре int)
Но, честно говоря, я бы посоветовал просто создать представление для каждого устройства.