>데이터 베이스 >MySQL 튜토리얼 >PostgreSQL 함수에서 쿼리 결과를 효율적으로 반환하려면 어떻게 해야 합니까?

PostgreSQL 함수에서 쿼리 결과를 효율적으로 반환하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-17 10:12:10373검색

How Can I Efficiently Return Query Results from PostgreSQL Functions?

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>

참고:

  • 충돌을 방지하려면 테이블 한정자를 사용하여 OUT 매개변수의 열 이름을 한정하세요.
  • 모호함을 방지하려면 OUT 매개변수와 열 별칭을 신중하게 선택하세요.
  • 열 이름으로 "text" 또는 "count"를 사용하지 마십시오.
  • 더 정확한 정수 나누기를 위해 숫자 데이터 유형을 사용하는 것을 고려해 보세요.

창 기능 사용의 대안

각 토큰의 상대적 점유율을 계산해야 하는 경우 쿼리에 창 기능을 사용하는 것을 고려해 보세요.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.