小编use*_*935的帖子

在 PostgreSQL 中使用动态列名

我正在使用 PostgreSSQL 8.3。

我想执行这个查询:

select COALESCE(col_fr,col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)

故事中的扭曲是列名colum_fr应该动态生成。my_table对于不同的语言有不同的列。就像是:

id   col   col_ja    col_fr
Run Code Online (Sandbox Code Playgroud)

我在水晶报告中使用此查询,我可以在其中传递语言的字符串参数:

select COALESCE(col_||{?parameter},col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)

如果{?language}value 是,它将在内部转换为如下内容fr

select COALESCE(col_||'fr',col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)

这永远不会奏效。

我不想使用选择大小写,使其动态化。
作为替代解决方案,我还尝试创建一个存储过程:

CREATE OR REPLACE FUNCTION get_policy_name (
  id text,
  lang   text,
  def_value text
)
RETURNS SETOF record AS
$body$
DECLARE
   sql text;
BEGIN
    sql := 'SELECT   COALESCE(col_'||quote_ident(lang)||',col,'||quote_literal(def_value)||')FROM my_table WHERE id ='||quote_literal(id);

   RETURN QUERY EXECUTE …
Run Code Online (Sandbox Code Playgroud)

postgresql stored-procedures dynamic-sql plpgsql postgresql-8.3

2
推荐指数
1
解决办法
2万
查看次数