PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Efek pemfilteran yang tidak terduga pada hasil dari kueri crosstab()

extra1, extra2, ... adalah "kolom tambahan" dalam terminologi tab silang.
Manual untuk modul tablefunc menjelaskan aturannya:

Dan lebih jauh ke bawah:

Penekanan berani pada bagian-bagian penting oleh saya.

Anda hanya mengurutkan berdasarkan row_name :

ORDER  BY row_name ASC

Tidak masalah dalam contoh pertama di mana Anda memfilter dengan:

WHERE ... t.extra1 = 'val1'  -- single quotes by me

Semua baris input memiliki extra1 = 'val1' omong-omong. Tapi itu penting dalam contoh kedua di mana Anda memfilter dengan:

WHERE ... t.extra1 IN('val1', ...) --> More values

Sekarang, persyaratan pertama yang dicetak tebal di atas dilanggar untuk kolom ekstra extra1 . Meskipun urutan kueri masukan pertama bersifat non-deterministik, nilai yang dihasilkan untuk kolom "ekstra" extra1 dipetik secara sewenang-wenang. Nilai yang lebih mungkin untuk extra1 , semakin sedikit baris yang akan berakhir dengan 'val1':itulah yang Anda amati.

Anda masih dapat membuatnya bekerja:untuk melaporkan extra1 = 'val1' untuk setiap row_name yang memiliki setidaknya satu dari itu, ubah ORDER BY ke:

ORDER  BY row_name, (extra1 <> 'val1')

Urutkan 'val1' di atas. Penjelasan untuk boolean itu ekspresi (dengan tautan ke lebih banyak):

Kolom "ekstra" lainnya masih dipilih secara sewenang-wenang sementara urutan pengurutannya tidak deterministik.

Dasar-dasar tab silang:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menentukan kunci utama yang dibuat secara otomatis yang digunakan sebagai kunci asing untuk tabel lain

  2. PostgreSQL mengubah cap waktu jenis tanpa zona waktu -> dengan zona waktu

  3. Bagaimana saya bisa melakukan vakum menggunakan PostgreSQL?

  4. Cara Mengonversi Stempel Waktu Unix ke Nilai Tanggal/Waktu di PostgreSQL

  5. Apa yang menentukan apakah Rails menyertakan id::serial dalam definisi tabel?