ホームページ >データベース >mysql チュートリアル >PostgreSQL クエリで関数から返された列が連結されるのはなぜですか?
関数から返されたレコードに連結列が表示される: 原因の解明
クエリでテーブルを結合し、関数から履歴データを取得すると、ユーザーは関数から返された列が 1 つの文字列に連結されて表示されるという問題が発生する可能性があります。この異常は、メイン クエリ内で関数を直接使用するときに発生します。
問題の理解
次のような複数の列を返す関数をクエリする場合:
account_servicetier_for_day(acct.accountid, '2014-08-12')
要求されたデータを含むレコードを返します。ただし、このレコードが別のクエリに埋め込まれている場合、PostgreSQL はそれを単一の連結された文字列として解釈します。
関数出力の分解
これを解決するには、ユーザーは個々のレコードを抽出する必要があります。関数のレコードの列。 PostgreSQL バージョン 9.3 以降では、JOIN LATERAL 構文を使用してこれを実現できます。これにより、関数を FROM 句にシームレスに統合できます。
JOIN LATERAL account_servicetier_for_day(a.accountid, '2014-08-12') f ON TRUE
ON TRUE 句により、左側からのすべての行が確実にテーブルは、返された行数に関係なく、関数の結果と結合されます。
PostgreSQL 9.2 以前では、列データを抽出するには、明示的なサブクエリが必要です。
(SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec FROM account_tab a) AS a
ここで、サブクエリは関数呼び出しの結果を rec という名前のレコードに割り当てます。外側のクエリは、a.rec.timestamp などのレコードの列を参照できます。
Avoiding Not In (Subquery)
最後に、使用を避けることをお勧めします。セット除外の場合は NOT IN (サブクエリ)。代わりに、より効率的でパフォーマンスの問題が発生しにくい NOT EXISTS 句を使用してください。
以上がPostgreSQL クエリで関数から返された列が連結されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。