> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL 쿼리에 사용될 때 집합 반환 함수의 열이 연결되는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?

PostgreSQL 쿼리에 사용될 때 집합 반환 함수의 열이 연결되는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-28 17:07:10
원래의
416명이 탐색했습니다.

Why are my set-returning function's columns concatenated when used in a PostgreSQL query, and how can I resolve this?

함수에서 반환된 레코드의 연결된 열

이 문제는 다른 쿼리 내에서 집합 반환 함수를 사용하여 쿼리를 실행하려고 할 때 발생하며 결과적으로 모든 함수 반환이 발생합니다. 열을 하나의 열로 연결합니다.

기능 선언

다음 Postgres 함수 account_servicetier_for_day는 계정 ID와 날짜를 가져와 과거 데이터를 반환합니다.

CREATE OR REPLACE FUNCTION account_servicetier_for_day(_accountid integer, _day timestamp without time zone) RETURNS setof account_dsl_history_info AS
$BODY$
DECLARE _accountingrow record;
BEGIN
  Return Query
  Select * From account_dsl_history_info
  Where accountid = _accountid And timestamp <= _day + interval '1 day - 1 millisecond'
  Order By timestamp Desc 
  Limit 1;
END;
$BODY$ LANGUAGE plpgsql;
로그인 후 복사

문제: 연결된 열

함수가 다음과 같은 경우 직접 실행하면 별도의 열과 함께 예상 결과가 반환됩니다. 그러나 쿼리 내에서 사용하면 열이 하나로 연결됩니다.

Select
    '2014-08-12' As day, 0 As inbytes, 0 As outbytes, acct.username, acct.accountid, acct.userid,
    account_servicetier_for_day(acct.accountid, '2014-08-12')
From account_tab acct
Where acct.isdsl = 1
    And acct.dslservicetypeid Is Not Null
    And acct.accountid Not In (Select accountid From dailyaccounting_tab Where Day = '2014-08-12')
Order By acct.username
로그인 후 복사

해결책: SQL 분해

함수에서 반환된 레코드를 개별 열로 분해하려면 SQL 구문을 사용하세요.

SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');
로그인 후 복사

Postgres 9.3 이상

Postgres 9.3 이상에서는 JOIN LATERAL을 사용하여 쿼리를 다시 작성할 수 있습니다.

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
     , a.username, a.accountid, a.userid
     , f.*   -- but avoid duplicate column names!
FROM   account_tab a
     , account_servicetier_for_day(a.accountid, '2014-08-12') f  -- <-- HERE
WHERE  a.isdsl = 1
AND    a.dslservicetypeid IS NOT NULL
AND    NOT EXISTS (
   SELECT FROM dailyaccounting_tab
   WHERE  day = '2014-08-12'
   AND    accountid = a.accountid
   )
ORDER  BY a.username;
로그인 후 복사

Postgres 9.2 이하

Postgres 9.2 이하의 경우 하위 쿼리를 사용하여 집합 반환 함수를 호출하고 외부 쿼리에서 레코드를 분해합니다.

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
     , a.username, a.accountid, a.userid
     , (a.rec).*   -- but be wary of duplicate column names!
FROM  (
   SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec
   FROM   account_tab a
   WHERE  a.isdsl = 1
   AND    a.dslservicetypeid Is Not Null
   AND    NOT EXISTS (
       SELECT FROM dailyaccounting_tab
       WHERE  day = '2014-08-12'
       AND    accountid = a.accountid
      )
   ) a
ORDER  BY a.username;
로그인 후 복사

위 내용은 PostgreSQL 쿼리에 사용될 때 집합 반환 함수의 열이 연결되는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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