> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL 함수 내에서 SELECT 쿼리 결과를 반환하는 방법은 무엇입니까?

PostgreSQL 함수 내에서 SELECT 쿼리 결과를 반환하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-17 10:21:12
원래의
984명이 탐색했습니다.

How to Return the Result of a SELECT Query within a PostgreSQL Function?

함수 내 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, cntratio 열이 있는 테이블입니다. 정확한 비율 계산을 보장하려면 명시적 유형 캐스팅에 ::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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿