我只需要使用列名和值连接两个表。
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
。
答案 0 :(得分:2)
你不能在sql中使用表格和列名等模式元素的变量,但你可以在plpgsql函数中构建一个查询(作为文本)并使用EXECUTE语句执行它(如@ user3222580所指出的)
这是我构建查询并将结果作为TABLE返回的示例。您必须在RETURNS部分中定义要返回的数据的结构。
我试图重现你的测试用例,但我不确定该功能是否确实如此,你需要它。把它作为代码示例。我遍历表格中的记录'文章'并取列#column; 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();