복붙노트

[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. ==============================

    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. ==============================

    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;
    
  3. 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