加入动态列名称

时间:2015-03-10 10:40:57

标签: sql postgresql

我只需要使用列名和值连接两个表。

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 个答案:

答案 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();