[SQL] 어떻게 PostgreSQL의에서 함수 내부에서 SELECT의 결과를 반환하는?
SQL어떻게 PostgreSQL의에서 함수 내부에서 SELECT의 결과를 반환하는?
나는 PostgreSQL의에서이 기능을 가지고,하지만 난 쿼리의 결과를 반환하는 방법을 모른다 :
CREATE OR REPLACE FUNCTION wordFrequency(maxTokens INTEGER)
RETURNS SETOF RECORD AS
$$
BEGIN
SELECT text, count(*), 100 / maxTokens * count(*)
FROM (
SELECT text
FROM token
WHERE chartype = 'ALPHABETIC'
LIMIT maxTokens
) as tokens
GROUP BY text
ORDER BY count DESC
END
$$
LANGUAGE plpgsql;
하지만 난 PostgreSQL의 함수 내에서 쿼리의 결과를 반환하는 방법을 모르겠어요.
나는 반환 형식이 SETOF RECORD, 바로해야한다는 발견? 그러나 복귀 명령은 옳지 않다.
이 작업을 수행하는 올바른 방법은 무엇입니까?
해결법
-
==============================
1.사용 RETURN QUERY :
사용 RETURN QUERY :
CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text -- also visible as OUT parameter inside function , cnt bigint , ratio bigint) AS $func$ BEGIN RETURN QUERY SELECT t.txt , count(*) AS cnt -- column alias only visible inside , (count(*) * 100) / _max_tokens -- I added brackets FROM ( SELECT t.txt FROM token t WHERE t.chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; -- potential ambiguity END $func$ LANGUAGE plpgsql;
요구:
SELECT * FROM word_frequency(123);
설명:
이것은 내가 당신의 쿼리가 실제로 (토큰 당 상대적으로 점유율을 계산)과 같이해야한다고 생각 것입니다 :
CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text , abs_cnt bigint , relative_share numeric) AS $func$ BEGIN RETURN QUERY SELECT t.txt, t.cnt , round((t.cnt * 100) / (sum(t.cnt) OVER ()), 2) -- AS relative_share FROM ( SELECT t.txt, count(*) AS cnt FROM token t WHERE t.chartype = 'ALPHABETIC' GROUP BY t.txt ORDER BY cnt DESC LIMIT _max_tokens ) t ORDER BY t.cnt DESC; END $func$ LANGUAGE plpgsql;
발현 합 (t.cnt) OVER ()는 윈도 함수. 꽤 있지만, 하위 쿼리는이 같은 간단한 경우에 일반적으로 저렴합니다 - 당신은 하위 쿼리 대신 CTE를 사용할 수 있습니다.
(OUT 매개 변수의 암시를 사용한다) OUT 매개 변수 또는 RETURNS TABLE 작업 할 때 마지막 명시 적 RETURN 문이 필요합니다 (그러나 허용)되지 않습니다.
두 개의 매개 변수 () 라운드는 숫자 유형에 대해 작동합니다. 서브 쿼리에서 () 계산하는 것은 BIGINT 결과와 합 ()이 BIGINT가 숫자 결과를 생성을 통해, 따라서 우리는 자동으로 숫자 숫자를 처리하고 모든 것이 제자리에 떨어진다을 생산하고 있습니다.
-
==============================
2.안녕하세요 아래 링크를 확인하시기 바랍니다
안녕하세요 아래 링크를 확인하시기 바랍니다
https://www.postgresql.org/docs/current/xfunc-sql.html
전의:
CREATE FUNCTION sum_n_product_with_tab (x int) RETURNS TABLE(sum int, product int) AS $$ SELECT $1 + tab.y, $1 * tab.y FROM tab; $$ LANGUAGE SQL;
from https://stackoverflow.com/questions/7945932/how-to-return-result-of-a-select-inside-a-function-in-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL의 조합에 의해 주문하는? (0) | 2020.04.01 |
---|---|
[SQL] Grails의 SQL 문을 기록하는 방법 (0) | 2020.04.01 |
[SQL] SQL 서버 : 사용하여 테이블의 기본 키를 얻기 SQL 쿼리 [중복] (0) | 2020.04.01 |
[SQL] 어떻게 프로그램에 DbContext.SaveChanges ()에서 생성 된 SQL을 기록 할 수 있습니까? [복제] (0) | 2020.04.01 |
[SQL] SQL Server의 선두에 제로 패딩으로 숫자 서식 (0) | 2020.04.01 |