함수의 CASE 조건식 내에서 SELECT 문을 사용할 수 있습니까?
위의 작업을 수행하기 위해 다음 기능을 시도했습니다.
예 : 일부 행을 포함하는 테이블을 표시하는 데 사용되는 함수가 있습니다.
create or replace function test(n integer)
returns table (name text,city text) as
$body$
begin
case n when 1 then
select * from table1
when 2 then
select * from table2
when 3 then
select * from view1
end;
end;
$body$
language plpgsql;
-호출 기능
select * from test(1);
/*have to show details of table1*/
select * from test(2);
/*have to show details of table2*/
select * from test(3);
/*have to display details of view1*/
실제로 SQL 표현식 과 혼동하지 말아야 할 plpgsql CASE
문 이 있습니다 .CASE
CREATE OR REPLACE function test(n integer)
RETURNS TABLE (name text, city text) AS
$func$
BEGIN
CASE n
WHEN 1 THEN
RETURN QUERY SELECT t.name, t.city FROM table1 t;
WHEN 2 THEN
RETURN QUERY SELECT t.foo, t.bar FROM table2 t;
WHEN 3 THEN
RETURN QUERY SELECT t.bar, t.bamm FROM view1 t;
END CASE;
END
$func$ LANGUAGE plpgsql;
함수를로 선언하면 RETURNS TABLE (name text, city text)
SELECT 문에 유형이 일치하는 열 목록이 있어야합니다.
반면에 원하는 경우 그에 따라 SELECT *
함수를 선언하십시오 RETURNS SETOF table1
.
반환 유형에서 열 이름을 지정할 때 해당 변수는 함수 본문에 표시됩니다. 동일한 이름과 충돌하는 열 이름을 테이블 규정해야합니다. 그래서 t.name
그냥 name
.
함수 내부 쿼리의 열 이름은 외부에 표시되지 않습니다. 선언 된 반환 유형 만. 따라서 이름은 일치 할 필요가 없으며 데이터 유형 만 있습니다.
어느 쪽이든 단순화하는 것이 좋습니다.
CREATE OR REPLACE function test(n integer)
RETURNS SETOF table1 AS
$func$
SELECT * FROM table1 t WHERE n = 1
UNION ALL
SELECT * FROM table2 t WHERE n = 2
UNION ALL
SELECT * FROM view1 t WHERE n = 3;
$func$ LANGUAGE sql;
같은 결과. 빨리. SQL 또는 PL / pgSQL 함수는 취향과 기타 세부 사항의 문제입니다. PL / pgSQL은 아마도 독립형 호출에 더 빠를 것입니다. SQL은 더 쉽게 중첩 될 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다