是否可以在PostgreSQL中创建一个以列名作为输入的函数?

tau*_*orf 3 database postgresql function plpgsql

我有两个这样的表:

CREATE TABLE table1_lang
(
  id serial NOT NULL,
  lang1 character varying,
  lang2 character varying,
  ...
)

CREATE TABLE table2_lang
(
  id serial NOT NULL,
  table1_id NOT NULL,
  lang1 character varying,
  lang2 character varying,
  ...
)
Run Code Online (Sandbox Code Playgroud)

每个lang列均包含不同语言的名称。我想创建一个从table1_lang返回所选lang的函数(如果存在)。如果该名称在table1_lang中不存在,则该函数应从table2_lang返回该名称。

到目前为止,我已经使用plpgsql中的此函数解决了我的问题:

CREATE OR REPLACE FUNCTION get_name(integer, text)
  RETURNS character varying AS
$BODY$
DECLARE
    in_id ALIAS FOR $1;
    lang ALIAS FOR $2;
    table1_name varchar;
    table2_name varchar;
BEGIN
    IF lang IS NOT NULL AND lang = 'lang1' THEN
        SELECT a.lang1 INTO table1_name
            FROM table1_lang a
            WHERE a.id = in_id;

            IF table1_name IS NOT NULL AND length(table1_name) > 0 THEN
            RETURN table1_name;
        ELSE
            SELECT a.lang1 INTO table2_name
            FROM table2_lang a
            WHERE a.table1_id = in_id;

            IF table2_name IS NOT NULL AND length(table2_name) > 0 THEN
                RETURN table2_name;
            END IF;
        END IF; 
    END IF;

    IF lang IS NOT NULL AND lang = 'lang2' THEN
        SELECT a.lang2 INTO table1_name
            FROM table1_lang a
            WHERE a.id = in_id;

            IF table1_name IS NOT NULL AND length(table1_name) > 0 THEN
            RETURN table1_name;
        ELSE
            SELECT a.lang2 INTO table2_name
            FROM table2_lang a
            WHERE a.table1_id = in_id;

            IF table2_name IS NOT NULL AND length(table2_name) > 0 THEN
                RETURN table2_name;
            END IF;
        END IF;             
    END IF;

    ...

    IF table2_name IS NULL OR length(table2_name) = 0 THEN
        RETURN NULL;
    END IF;

END
$BODY$
  LANGUAGE plpgsql VOLATILE STRICT
  COST 100;
ALTER FUNCTION get_name(integer, text) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

但是我想知道是否可以用plpgsql或PostgreSQL中可用的其他语言创建一个函数,该函数将列作为输入参数?

Erw*_*ter 5

在plpgsql函数中是可能的。但是,如果对标识符(包括列名)进行了参数设置,则必须构建动态SQL并使用来执行EXECUTE。在此处阅读手册中的内容。请注意不要通过这样做来允许SQL注入。利用quote_ident()format()

我用链接和解释写了几个类似的答案。试试这个开始或这个