Apakah PostgreSQL mendukung kolom yang dihitung / dihitung, seperti MS SQL Server? Saya tidak dapat menemukan apa pun di dokumen, tetapi karena fitur ini disertakan di banyak DBMS lain, saya pikir saya mungkin melewatkan sesuatu.
Misalnya: http://msdn.microsoft.com/en-us/library/ms191250.aspx
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Mike Chamberlain
sumber
sumber
Jawaban:
Hingga Postgres 11 kolom yang dihasilkan tidak didukung - seperti yang didefinisikan dalam standar SQL dan diimplementasikan oleh beberapa RDBMS termasuk DB2, MySQL dan Oracle. Juga tidak "kolom dihitung" serupa dari SQL Server.
STORED
kolom yang dihasilkan diperkenalkan dengan Postgres 12 . Contoh sepele:db <> biola di sini
VIRTUAL
kolom yang dihasilkan mungkin datang dengan salah satu dari iterasi berikutnya. (Belum di Postgres 13).Terkait:
Sampai saat itu , Anda dapat meniru
VIRTUAL
kolom yang dihasilkan dengan fungsi menggunakan notasi atribut (tbl.col
) yang terlihat dan berfungsi seperti kolom yang dibuat secara virtual . Itu sedikit keanehan sintaksis yang ada di Postgres karena alasan historis dan kebetulan cocok dengan kasusnya. Jawaban terkait ini memiliki contoh kode :Ekspresi (tampak seperti kolom) tidak disertakan dalam a
SELECT * FROM tbl
. Anda harus selalu mencantumkannya secara eksplisit.Dapat juga didukung dengan indeks ekspresi yang cocok - asalkan fungsinya adalah
IMMUTABLE
. Suka:Alternatif
Alternatifnya, Anda bisa mengimplementasikan fungsionalitas serupa dengan
VIEW
, secara opsional digabungkan dengan indeks ekspresi. KemudianSELECT *
dapat menyertakan kolom yang dihasilkan.STORED
Kolom terhitung "Tetap" ( ) dapat diimplementasikan dengan pemicu dengan cara yang identik secara fungsional.Pandangan terwujud adalah konsep yang terkait erat, diimplementasikan sejak Postgres 9.3 .
Dalam versi sebelumnya, seseorang dapat mengelola MV secara manual.
sumber
Ya kamu bisa!! Solusinya harus mudah, aman, dan efektif ...
Saya baru mengenal postgresql, tetapi tampaknya Anda dapat membuat kolom yang dihitung dengan menggunakan indeks ekspresi , dipasangkan dengan tampilan (tampilan bersifat opsional, tetapi membuat hidup sedikit lebih mudah).
Misalkan perhitungan saya
md5(some_string_field)
, maka saya membuat index sebagai:Sekarang, kueri apa pun yang bekerja
MD5(some_string_field)
akan menggunakan indeks daripada menghitungnya dari awal. Sebagai contoh:Anda dapat memeriksa ini dengan menjelaskan .
Namun pada titik ini Anda mengandalkan pengguna tabel yang tahu persis bagaimana membuat kolom. Untuk membuat hidup lebih mudah, Anda dapat membuat
VIEW
tabel asli ke versi augmented, menambahkan nilai yang dihitung sebagai kolom baru:Sekarang kueri apa pun yang digunakan
some_table_augmented
akan dapat digunakansome_string_field_md5
tanpa mengkhawatirkan cara kerjanya .. mereka hanya mendapatkan kinerja yang baik. Tampilan tidak menyalin data apa pun dari tabel asli, jadi ini adalah memori yang baik dan juga kinerja. Namun perlu dicatat bahwa Anda tidak dapat memperbarui / menyisipkan ke dalam tampilan, hanya ke dalam tabel sumber, tetapi jika Anda benar-benar menginginkannya, saya yakin Anda dapat mengarahkan penyisipan dan pembaruan ke tabel sumber menggunakan aturan (saya bisa saja salah pada poin terakhir sebagai Saya belum pernah mencobanya sendiri).Sunting: tampaknya jika kueri melibatkan indeks yang bersaing, mesin perencana terkadang tidak menggunakan indeks ekspresi sama sekali. Pilihannya tampaknya bergantung pada data.
sumber
if the query involves competing indices
?Salah satu cara untuk melakukannya adalah dengan pemicu!
Pemicu diaktifkan sebelum baris diperbarui atau disisipkan. Ini mengubah bidang yang ingin kita hitung dari
NEW
catatan dan kemudian mengembalikan catatan itu.sumber
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
dan baru saja kembali: 1 2 dan 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
nilaitwo
kolom akan dihitung secara otomatis!PostgreSQL 12 mendukung kolom yang dihasilkan:
db <> demo biola
sumber
Yah, tidak yakin apakah ini yang Anda maksud tetapi Posgres biasanya mendukung sintaks ETL "dummy". Saya membuat satu kolom kosong dalam tabel dan kemudian perlu mengisinya dengan catatan terhitung tergantung pada nilai dalam baris.
sumber
Saya memiliki kode yang berfungsi dan menggunakan istilah dihitung, saya tidak menggunakan postgresSQL murni sehingga kami menjalankan di PADB
inilah cara penggunaannya
sumber
Solusi ringan dengan kendala Periksa:
sumber
field as 1 persisted
.