Динамический столбец в пост-ГРЭС оператора SELECT

Я довольно плохо знаком с postgresql.

что лучший способ состоит в том, чтобы достигнуть этого?

SELECT get_columns() 
  FROM table_name;

get_columns() обеспечит имена столбцов для запроса. Я видел, что люди советовали для использования оператора EXECUTE, но я не мог, получил ту работу.

Позволяет говорят, что существует Тест таблицы со столбцами a, b, c, и я хочу работать

SELECT a,b FROM Test;
SELECT a,c FROM Test;

с именами столбцов, сгенерированными динамично.

8
задан OMG Ponies 3 March 2010 в 20:34
поделиться

4 ответа

В В таком случае я бы использовал функцию PL / pgSQL с курсором .

1
ответ дан 6 December 2019 в 00:06
поделиться

Поскольку вы используете КОПИРОВАТЬ ИЗ в известную большую таблицу, СОЗДАЙТЕ ФУНКЦИЮ, которая возвращает 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 (или что-то еще) могут быть подходящими.

0
ответ дан 6 December 2019 в 00:06
поделиться

Вот как вы получаете имена столбцов в таблице:

SELECT 
  column_name 
FROM 
  information_schema.columns 
WHERE 
  table_name = 'test';
-3
ответ дан 6 December 2019 в 00:06
поделиться

Вы не сможете использовать функцию для создания списка столбцов. И я действительно не думаю, что это лучший способ решения проблемы ... Тем не менее, вы можете сделать это с помощью 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)

Но, честно говоря, я бы посоветовал просто создать представление для каждого устройства.

0
ответ дан 6 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: