함수 내 PostgreSQL SELECT 쿼리에서 데이터 반환
이 가이드에서는 PostgreSQL 함수 내에서 SELECT
쿼리 결과를 반환하는 일반적인 문제를 다룹니다. 핵심은 반환 유형을 올바르게 정의하고 적절한 구문을 사용하는 방법을 이해하는 것입니다.
RETURN QUERY
솔루션:
가장 효과적인 방법은 RETURN QUERY
명령을 사용하는 것입니다. 이는 반환된 열과 해당 데이터 유형을 명확하게 정의합니다. 다음 예를 고려해보세요:
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT) RETURNS TABLE (txt TEXT, cnt BIGINT, ratio NUMERIC) AS $$ BEGIN RETURN QUERY SELECT t.txt, count(*) AS cnt, (count(*)::NUMERIC * 100) / _max_tokens AS ratio FROM ( SELECT txt FROM token WHERE chartype = 'ALPHABETIC' LIMIT _max_tokens ) t GROUP BY t.txt ORDER BY cnt DESC; END; $$ LANGUAGE plpgsql;</code>
이 함수의 반환 유형은 명시적으로 txt
, cnt
및 ratio
열이 있는 테이블입니다. 정확한 비율 계산을 보장하려면 명시적 유형 캐스팅에 ::NUMERIC
을 사용하세요. 별도의 RETURN
문이 없는 것은 의도적인 것입니다. RETURN QUERY
은 반환 값을 처리합니다.
신중한 이름 지정:
출력 매개변수와 쿼리 열 이름 간의 이름 충돌을 방지하세요. 테이블 제한(예: t.txt
)을 사용하면 모호성을 방지할 수 있습니다.
상대 지분 계산을 위한 대체 접근 방식:
각 토큰의 상대적 지분을 계산할 때 창 기능을 사용하는 대안은 효율성을 향상시킵니다.
<code class="language-sql">CREATE OR REPLACE FUNCTION word_frequency(_max_tokens INT) RETURNS TABLE (txt TEXT, abs_cnt BIGINT, relative_share NUMERIC) AS $$ BEGIN RETURN QUERY SELECT txt, cnt, ROUND((cnt::NUMERIC * 100) / SUM(cnt) OVER (), 2) AS relative_share FROM ( SELECT txt, COUNT(*) AS cnt FROM token WHERE chartype = 'ALPHABETIC' GROUP BY txt ORDER BY cnt DESC LIMIT _max_tokens ) t ORDER BY cnt DESC; END; $$ LANGUAGE plpgsql;</code>
이 버전에서는 SUM(cnt) OVER ()
을 사용하여 모든 행의 총 개수를 계산하므로 보다 간결한 상대 점유율 계산이 제공됩니다.
중요 사항:
RETURN
또는 출력 매개변수를 사용할 때는 명시적인 RETURNS TABLE
문이 필요하지 않습니다. 함수의 반환 동작은 RETURNS
절과 쿼리 자체에 의해 정의됩니다.
위 내용은 PostgreSQL 함수 내에서 SELECT 쿼리 결과를 반환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!