1

다음 한 쿼리에서 반환 단일 항목.전화 설정을 돌려 각 행에 대해 plpgsql 기능을 9.6 데이터베이스 나 사용자 정의 도메인과 테이블 정의 내 포스트 그레스에서

reslt2

create or replace function allIdLowResData() returns setof float[] as 
$body$ 
declare r text; 
begin 
    for r in (select id from myRawValues where /*SOME CONDITION*/) 
    loop 
    return next myPlotter(getAxis(r), getData(r)); 
    end loop; 
    return; 
end 
$body$ 
language plpgsql; 
: result1

create function getData(_id 'text') returns float[] as $$ 
select myData 
from myRawValues 
where id = _id 
$$ language sql; 

create function getAxis(_id 'text') returns float[] as $$ 
select xAxis 
from myRawValues 
where id = _id 
$$ language sql; 

create function myPlotter(myarray float[], myData float[]) 
returns table (frequency float, amplitude float) as 
$$ 
select * 
from unnest(myarray, myData) as u; 
$$ language sql; 

select * from myPlotter(getAxis('123'), getData('123')); 

나는 특정 쿼리를 실행에서 을 위해 생산 된 모든id 년대를 동일한 작업을 수행하고이 같은 결과 끝내고 싶어

+1

나중에 참조 할 수 있도록 * 텍스트 *로 이미지를 게시하십시오. –

답변

1

LATERAL 조인을 사용하여 세트를 결합하십시오 나머지 쿼리와 함수를 urning. 마찬가지로 :

CREATE OR REPLACE FUNCTION allIdLowResData() 
    RETURNS TABLE (frequency float, amplitude float, id text) AS 
$func$ 
SELECT p.*, r.id 
FROM myRawValues r 
LEFT JOIN LATERAL myPlotter(r.xAxis, r.myData) p ON true 
WHERE /*SOME CONDITION*/ 
$func$ LANGUAGE sql; 

참조 :

플러스, 실제로 반환 무슨 일치해야합니다 기능 (RETURNS)의 선언 된 반환 값의 형태.

더 간단한 SQL 함수를 여기에 사용하십시오. 이 경우 PL/pgSQL을 사용하여 동일하게 수행 할 수 있습니다 (RETURNS QUERY).

당신은 포스트 그레스 배열 정의에 대한 이러한 세부 사항에 관심이있을 수도

quoted from the manual: 그러나, 현재 구현은 어떤 공급 배열 크기를 한계, 즉 무시는 동작은 지정 길이의 배열과 동일 .

현재 구현에서는 선언 된 숫자 인 을 적용하지 않습니다. 특정 요소 유형의 배열은 차원의 크기 또는 수에 관계없이 모두 동일한 유형으로 간주되는 입니다. 따라서 배열 크기 또는 차원 수를 CREATE TABLE으로 선언하는 것은 단순히 설명서입니다. 그것은 런타임 동작에 영향을 미치지 않습니다.

의미, 귀하의 domain은 현재 아무런 영향도 미치지 않습니다 (합병증 제외). 테이블에 정확히 21 개의 요소가있는 1 차원 배열을 실제로 적용하려면 CHECK 제약 조건을 사용하십시오. 마찬가지로 : 그들에게 더가없는

CREATE DOMAIN lowResData AS float[21] -- "[21]" is just for documentation 
CONSTRAINT dim1_elem21 CHECK (array_ndims(VALUE) = 1 AND array_length(VALUE, 1) = 21); 

나는 또한 기능 getData()getAxis() 도랑 것이다.