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;