関数から返されたレコードには連結された列があります
関数を利用して特定の目的でデータを取得する場合、返されるレコードの列が 1 つの列に連結されます。これは、関数が別のクエリ内のサブクエリとして使用されている場合に発生する可能性があります。
関数の結果について
関数から返された行を分解して個々の列を取得するには、次のようにします。関数を個別に実行するだけです:
SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');
これにより、期待される列形式の出力が提供されます。 Structure.
元のクエリのアドレス指定
元のクエリの問題を解決するには、使用されている PostgreSQL のバージョンに応じて複数のアプローチがあります。
PostgreSQL 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;
PostgreSQL 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 中国語 Web サイトの他の関連記事を参照してください。