Postgresql PL/PGSQL运算符不存在:信息\u schema.sql\u标识符

Postgresql PL/PGSQL运算符不存在:信息\u schema.sql\u标识符,postgresql,plpgsql,Postgresql,Plpgsql,我正在编写一个函数来编写动态查询 这是没有函数的原始查询 SELECT b.column_name, a.default_flag, CAST(AVG(a.payment_ratio) AS NUMERIC), CAST(MAX(a.payment_ratio) AS NUMERIC) FROM user_joined a, information_schema.columns b where b.column_name = 'payment_ratio' group by a.default

我正在编写一个函数来编写动态查询

这是没有函数的原始查询

SELECT b.column_name, a.default_flag, CAST(AVG(a.payment_ratio) AS NUMERIC), CAST(MAX(a.payment_ratio) AS NUMERIC)  FROM user_joined a, information_schema.columns b where b.column_name = 'payment_ratio' group by a.default_flag, b.column_name
然后,我把它放到这样的函数中

CREATE OR REPLACE FUNCTION test4(col text)
RETURNS TABLE(
    col_name TEXT,
    default_flag bigint,
    average NUMERIC,
    maximum NUMERIC) AS $$
BEGIN 
RETURN QUERY EXECUTE FORMAT
('SELECT CAST(b.column_name AS TEXT), a.default_flag, CAST(AVG(a.'||col||') AS NUMERIC), CAST(MAX(a.'||col||') AS NUMERIC)  FROM user_joined a, information_schema.columns b where b.column_name = %I group by a.default_flag, b.column_name', col);
END; $$
LANGUAGE PLPGSQL;
当我试着跑的时候

SELECT * FROM test4('payment_ratio')
我得到这个错误

ERROR:  operator does not exist: information_schema.sql_identifier = double precision
LINE 1: ... information_schema.columns b where b.column_name = payment_...
我的函数有什么问题吗?

信息模式中的列具有某种奇怪的数据类型sql标识符,无法直接与文本值进行比较。您需要在SQL查询中强制转换它

您还错误地使用了%I。在联接条件中,列名是一个字符串常量,因此需要在其中使用%L。在选择列表中,它是一个标识符,因此您需要在其中使用%I


好了,现在可以了!谢谢,我不知道我应该使用%L
CREATE OR REPLACE FUNCTION test4(col text)
RETURNS TABLE(
    col_name TEXT,
    default_flag bigint,
    average NUMERIC,
    maximum NUMERIC) AS $$
BEGIN 
RETURN QUERY EXECUTE 
   FORMAT ('SELECT CAST(b.column_name AS TEXT), 
                   a.default_flag, CAST(AVG(a.%I) AS NUMERIC), 
                   CAST(MAX(a.'||col||') AS NUMERIC)  
            FROM user_joined a
              JOIN information_schema.columns b ON b.column_name::text = %L 
            group by a.default_flag, b.column_name', col, col);
END; $$
LANGUAGE PLPGSQL;