2015-03-10 5 views
1

Мне нужно объединить две таблицы только с именами столбцов и значениями.Присоединиться к имени динамического столбца

article 
------- 
id | cf_camera | cf_display | cf_... 
1 | 15  | NULL  | NULL 

custom_field 
------------ 
id | column_name | name | description 
1 | 'cf_camera' |  | 
2 | 'cf_display' |  | 

Я попытался написать запрос, но не знаю, как сделать динамическое соединение столбцов со статьей.

select 
    a.id, 
    cf.id 
from 
    custom_field cf 
inner join 
    article a 
on 
    a.cf.column_name is not null and 
    a.cf.column_name::integer > 0 

Проблема находится здесь a.cf.column_name.

+1

Вы должны использовать "RETURN QUERY ВЫПОЛНИТЬ", как [здесь] [1] [1]: HTTP: // StackOverflow .com/вопросы/21619189/как к нарисуй стол-с-динамического идентификатора-в-Postgres –

ответ

2

Вы не можете использовать переменные для элементов схемы, такие как имена таблиц и столбцов в sql, но вы можете построить запрос (как текст) в функции plpgsql и выполнить его с помощью оператора EXECUTE (как указано @ user3222580)

Это пример. Я строю запрос и возвращаю результат как ТАБЛИЦУ. Вы должны определить структуру данных, которые вы хотите вернуть в части RETURNS.

Я попытался воспроизвести ваш тестовый пример, но я не уверен, что функция действительно нужна, вам нужно. Возьмите его как образец кода. Я перебираю записи в «статьях» таблицы и беру значение столбца «column_name» для построения запроса SELECT ... UNION SELECT.

CREATE OR REPLACE FUNCTION test_function() RETURNS TABLE (a_id int, cf_id int) as 
    $$ 
    DECLARE _column_name text; _query text; counter int; 
    BEGIN 
    _query = ''; 
    counter = 0; 

    FOR _column_name in SELECT column_name FROM custom_field LOOP 

     IF counter > 0 THEN 
     _query = _query || ' UNION '; 
     END IF; 
     _query = _query ||'select 
     a.id, 
     cf.id 
    from 
     custom_field cf 
    inner join 
     article a 
    on 
     '||_column_name||' is not null and 
     '||_column_name||'::integer > 0'; 

     counter = counter+ 1; 
    END LOOP; 
    raise info '%', _query; 
    RETURN QUERY EXECUTE _query; 
    END; 
    $$ 
language plpgsql; 

Так вы можете вызвать функцию:

SELECT * from test_function(); 
Смежные вопросы