PostgreSQL - 如何在函数中动态执行查询 return table
PostgreSQL - How to dynamically execute a query in a function and return table
我正在尝试编写一个函数,如果我将一个变量传递给该函数,那么根据该变量的值,应该执行不同的查询。
CREATE OR REPLACE FUNCTION SW_Versions(VersionType varchar)
RETURNS TABLE(array_sw_version varchar) AS $$
BEGIN
IF VersionType = 'All' THEN
EXECUTE 'select ''1'' as array1_sw_version UNION ALL
select ''2'' as array1_sw_version';
ELSIF VersionType = 'Major' THEN
EXECUTE 'select ''A'' as array2_sw_version UNION ALL
select ''B'' as array2_sw_version';
ELSE
EXECUTE 'select ''X'' as array3_sw_version UNION ALL
select ''Y'' as array3_sw_version';
END IF;
END;
$$ LANGUAGE plpgsql STRICT;
SELECT SW_Versions('Major')
上面的查询没有产生正确的结果,应该是 2。
谁能帮我找出我做错了什么?
你不需要EXECUTE
。请改用 RETURN QUERY
。添加了转换 (::varchar
) 以提供列类型兼容性。
CREATE OR REPLACE FUNCTION SW_Versions(VersionType varchar)
RETURNS TABLE(array_sw_version varchar) AS $$
BEGIN
IF VersionType = 'All' THEN
RETURN QUERY select '1'::varchar as array1_sw_version UNION ALL
select '2'::varchar as array1_sw_version;
ELSIF VersionType = 'Major' THEN
RETURN QUERY select 'A'::varchar as array2_sw_version UNION ALL
select 'B'::varchar as array2_sw_version;
ELSE
RETURN QUERY select 'X'::varchar as array3_sw_version UNION ALL
select 'Y'::varchar as array3_sw_version;
END IF;
END;
$$ LANGUAGE plpgsql STRICT;
SELECT SW_Versions('Major')
我正在尝试编写一个函数,如果我将一个变量传递给该函数,那么根据该变量的值,应该执行不同的查询。
CREATE OR REPLACE FUNCTION SW_Versions(VersionType varchar)
RETURNS TABLE(array_sw_version varchar) AS $$
BEGIN
IF VersionType = 'All' THEN
EXECUTE 'select ''1'' as array1_sw_version UNION ALL
select ''2'' as array1_sw_version';
ELSIF VersionType = 'Major' THEN
EXECUTE 'select ''A'' as array2_sw_version UNION ALL
select ''B'' as array2_sw_version';
ELSE
EXECUTE 'select ''X'' as array3_sw_version UNION ALL
select ''Y'' as array3_sw_version';
END IF;
END;
$$ LANGUAGE plpgsql STRICT;
SELECT SW_Versions('Major')
上面的查询没有产生正确的结果,应该是 2。 谁能帮我找出我做错了什么?
你不需要EXECUTE
。请改用 RETURN QUERY
。添加了转换 (::varchar
) 以提供列类型兼容性。
CREATE OR REPLACE FUNCTION SW_Versions(VersionType varchar)
RETURNS TABLE(array_sw_version varchar) AS $$
BEGIN
IF VersionType = 'All' THEN
RETURN QUERY select '1'::varchar as array1_sw_version UNION ALL
select '2'::varchar as array1_sw_version;
ELSIF VersionType = 'Major' THEN
RETURN QUERY select 'A'::varchar as array2_sw_version UNION ALL
select 'B'::varchar as array2_sw_version;
ELSE
RETURN QUERY select 'X'::varchar as array3_sw_version UNION ALL
select 'Y'::varchar as array3_sw_version;
END IF;
END;
$$ LANGUAGE plpgsql STRICT;
SELECT SW_Versions('Major')