Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mengendalikan Jenis Pengembalian SQL Dinamik dalam PostgreSQL dengan Nama dan Jenis Lajur yang Bervariasi?

Bagaimanakah Saya Boleh Mengendalikan Jenis Pengembalian SQL Dinamik dalam PostgreSQL dengan Nama dan Jenis Lajur yang Bervariasi?

DDD
Lepaskan: 2025-01-22 23:46:11
asal
103 orang telah melayarinya

How Can I Handle Dynamic SQL Return Types in PostgreSQL with Varying Column Names and Types?

SQL dinamik PostgreSQL dan jenis pulangan

Mengendalikan jenis pemulangan tersuai dengan nama dan jenis lajur yang berbeza

Dalam senario anda, jenis pemulangan akan berubah disebabkan oleh nama dan jenis lajur yang berbeza. Untuk mengendalikan ini, anda boleh memanfaatkan keupayaan PostgreSQL untuk mengembalikan jenis rekod tanpa nama:

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS SETOF record AS
...</code>
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini memerlukan penetapan takrif lajur secara manual dalam setiap panggilan fungsi:

<code class="language-sql">SELECT * FROM data_of(17)
AS foo (colum_name1 integer
      , colum_name2 text
      , colum_name3 real);</code>
Salin selepas log masuk

Untuk mengelakkan pendekatan yang membosankan ini, anda boleh menggunakan jenis data dokumen seperti JSON atau XML untuk menyimpan data tidak berstruktur:

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS JSONB AS
...</code>
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini akan mengorbankan kelebihan jenis data berstruktur PostgreSQL.

Jenis pulangan tetap menggunakan penukaran lajur

Jika struktur data anda konsisten (kecuali nama lajur), anda boleh mengembalikan nombor tetap lajur yang dinamakan dan ditaip dengan betul:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS
$func$
...</code>
Salin selepas log masuk

Untuk kesederhanaan, setiap lajur ditukar secara eksplisit kepada jenis TEKS.

Bilangan lajur boleh ubah dengan jenis yang sama

Jika anda mempunyai bilangan lajur yang berubah-ubah daripada jenis yang sama, anda boleh menggunakan tatasusunan untuk menyimpan nilai:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
Salin selepas log masuk
Salin selepas log masuk

Selain itu, anda boleh mengembalikan nama lajur sebagai tatasusunan:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
Salin selepas log masuk
Salin selepas log masuk

Kembalikan semua lajur jadual secara polimorf

Untuk mengembalikan semua lajur jadual, tanpa mengira strukturnya, anda boleh menggunakan anyelement jenis data pseudo:

<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int)
RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- pg_typeof returns regtype, quoted automatically
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
Salin selepas log masuk

Panggil fungsi ini dengan NULL jenis jadual yang diingini untuk menentukan jenis pulangan secara dinamik:

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Jenis Pengembalian SQL Dinamik dalam PostgreSQL dengan Nama dan Jenis Lajur yang Bervariasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan