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

Apa aturan untuk `tidak diketahui` dan jenis inferensi?

Sebenarnya ada tiga pertanyaan di sana yang akan saya coba jawab.

  1. Apa tujuan dari unknown ?

    Ini adalah tipe data yang awalnya ditetapkan untuk NULL dan literal string dalam pernyataan SQL. Jika literal tersebut diberikan ketik text segera, akan sulit untuk menyimpulkan jenis yang benar.

    Misalnya, Anda ingin myfunc('hello') untuk memanggil myfunc(character varying) , tetapi tidak ada tipe implisit yang dilemparkan dari text untuk character varying (dan akan menyebabkan ambiguitas jika Anda membuatnya).

  2. Mengapa SELECT null kembalikan kolom jenis unknown ?

    Jawaban tradisionalnya adalah:Karena pengguna tidak menentukan jenisnya.

    Namun, perilaku ini bermasalah. Misalnya, jika Anda membuat tabel seperti ini:

    CREATE TABLE test
       AS SELECT 'hello';
    

    Anda akan berakhir dengan kolom jenis unknown , yang tidak diinginkan dan akan menyebabkan masalah lebih lanjut. Jenis unknown seharusnya tidak terlihat oleh pengguna, melainkan detail implementasi.

    Akibatnya, komit ini telah mengubah perilaku dari PostgreSQL v10 pada:Sekarang unknown s tersisa di SELECT atau RETURNING daftar dipaksa untuk text , dan tabel tidak dapat dibuat dengan kolom bertipe unknown .

  3. Mengapa SELECT NULL UNION SELECT 42 bekerja, tetapi tidak SELECT NULL UNION SELECT NULL UNION SELECT 42 ?

    Ini karena aturan konversi jenis .UNION dibiarkan asosiatif, sehingga kueri terakhir ditafsirkan sebagai

    (SELECT NULL UNION SELECT NULL) UNION SELECT 42;
    

    Sekarang UNION pertama memutuskan untuk tipe data text karena aturan 3:

    Ini menyebabkan kesalahan saat mencoba menyelesaikan jenis untuk UNION kedua karena aturan 4:

    Di sisi lain, dalam kueri

    SELECT NULL UNION SELECT 42;
    

    “NULL” memiliki tipe unknown , dan “42” memiliki tipe integer (tipe yang dipilih untuk literal numerik tanpa titik desimal).

    Aturan 5

    tidak berlaku di sini, karena integer bukan tipe yang disukai dalam kategorinya (yaitu oid dan double precision ), jadi aturan 6 digunakan:

    Ini menghasilkan jenis integer .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tidak ada entri pg_hba.conf untuk host

  2. Stempel Waktu Postgres

  3. Fungsi di PostgreSQL untuk menyisipkan dari satu tabel ke tabel lainnya?

  4. Postgres menyisipkan baris hanya jika jumlah baris di bawah batas

  5. Mengembangkan PostgreSQL untuk Windows, Bagian 1