PostgreSQL 함수로 쿼리 결과 반환
PostgreSQL은 함수에서 쿼리 결과를 반환하는 두 가지 방법, 즉 OUT 매개변수와 RETURNS TABLE을 제공합니다. OUT 매개변수를 사용할 때 함수 서명은 쿼리 값을 수신하는 변수 목록을 지정합니다. 그러나 이 접근 방식은 명시적인 반환 유형 정의를 금지하며 열 이름 충돌이 발생할 수 있습니다.
반품표 사용
더 편리하고 강력한 솔루션을 원하시면 RETURNS TABLE을 사용해 보세요. 이 구문은 함수의 정확한 반환 패턴을 정의하여 명시적인 열 이름과 유형 정의를 허용합니다.
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text -- 在函数体中也可见为 OUT 参数 , cnt bigint , ratio bigint) LANGUAGE plpgsql AS $func$ BEGIN RETURN QUERY SELECT t.txt , count(*) AS cnt -- 列别名仅在此查询中可见 , (count(*) * 100) / _max_tokens -- 我添加了括号 FROM ( SELECT t.txt FROM token t WHERE t.chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; -- 潜在的歧义 END $func$; SELECT * FROM word_frequency(123);</code>
참고:
창 기능 사용의 대안
각 토큰의 상대적 점유율을 계산해야 하는 경우 쿼리에 창 기능을 사용하는 것을 고려해 보세요.
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int) RETURNS TABLE (txt text , abs_cnt bigint , relative_share numeric) LANGUAGE plpgsql 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$;</code>
이 쿼리는 over() 절을 사용하여 각 토큰의 상대적 지분을 계산합니다.
위 내용은 PostgreSQL 함수에서 쿼리 결과를 효율적으로 반환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!