Rekod yang Dikembalikan daripada Fungsi Mempunyai Lajur Disatukan
Apabila menggunakan fungsi untuk mendapatkan semula data untuk tujuan tertentu, ia mungkin mendapati bahawa yang dikembalikan lajur rekod disatukan menjadi satu lajur. Ini boleh berlaku apabila fungsi digunakan sebagai subkueri dalam pertanyaan lain.
Memahami Hasil Fungsi
Untuk menguraikan baris yang dikembalikan daripada fungsi dan dapatkan lajur individu, hanya laksanakan fungsi secara berasingan:
SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');
Ini akan memberikan output dengan kolumnar yang dijangkakan struktur.
Menangani Pertanyaan Asal
Untuk menyelesaikan masalah dengan pertanyaan asal, terdapat berbilang pendekatan bergantung pada versi PostgreSQL yang digunakan:
PostgreSQL 9.3 atau Lebih Baru
Gunakan JOIN LATERAL untuk menyambungkan subkueri dan mengekalkan struktur baris:
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 atau Lebih Lama
Gunakan subkueri untuk memanggil fungsi dan menguraikan baris di bahagian luar pertanyaan:
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;
Dalam mana-mana pendekatan, beri perhatian kepada kemungkinan pendua nama lajur apabila memilih baris terurai.
Atas ialah kandungan terperinci Mengapa Lajur Dikembalikan Fungsi PostgreSQL Saya Disatukan, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!