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

Perilaku NOT LIKE dengan nilai NULL

Tentang NULL

'anything' NOT LIKE NULL menghasilkan NULL , bukan TRUE .
Dan hanya TRUE memenuhi syarat untuk ekspresi filter dalam WHERE klausa.

Sebagian besar fungsi mengembalikan NULL pada NULL masukan (ada pengecualian). Itulah sifat dari NULL di apa saja RDBMS yang tepat.

Jika Anda menginginkan tunggal ekspresi, Anda bisa gunakan:

AND   (column_default LIKE 'nextval%')  IS NOT TRUE;

Itu hampir tidak lebih pendek atau lebih cepat. Detail dalam manual.

Kueri yang tepat

Permintaan Anda masih tidak dapat diandalkan. Nama tabel saja tidak unik dalam database Postgres, Anda perlu menentukan nama skema sebagai tambahan atau mengandalkan search_path saat ini untuk menemukan kecocokan pertama di dalamnya:

Terkait:

  • Bagaimana search_path mempengaruhi resolusi pengenal dan "skema saat ini"
SELECT column_name
FROM   information_schema.columns
WHERE  table_name = 'hstore1'
AND    table_schema = 'public'   -- your schema
AND   (column_default IS NULL OR
       column_default NOT LIKE 'nextval%');

Lebih baik, tapi tetap tidak anti peluru. Default kolom yang dimulai dengan 'nextval' tidak membuat serial , belum. Lihat:

  • Kolom tabel kenaikan otomatis

Untuk memastikannya, periksa apakah urutan yang digunakan "dimiliki" oleh kolom dengan pg_get_serial_sequence(table_name, column_name) .

Saya sendiri jarang menggunakan skema informasi. Tampilan yang lambat dan membengkak itu menjamin portabilitas di seluruh versi utama - dan bertujuan untuk portabilitas ke RDBMS yang sesuai standar lainnya. Tapi terlalu banyak juga tidak cocok. Oracle bahkan tidak mengimplementasikan skema informasi (per 2015).

Juga, kolom khusus Postgres yang berguna tidak ada dalam skema informasi. Untuk kasus ini saya mungkin menanyakan katalog sistem seperti ini:

SELECT *
FROM   pg_catalog.pg_attribute a
WHERE  attrelid = 'table1'::regclass
AND    NOT attisdropped   -- no dropped (dead) columns
AND    attnum > 0         -- no system columns
AND   NOT EXISTS (
   SELECT FROM pg_catalog.pg_attrdef d
   WHERE  (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
   AND    d.adsrc LIKE 'nextval%'
   AND    pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
   );

Lebih cepat dan lebih andal, tetapi kurang portabel.

Panduan:

Katalog pg_attrdef menyimpan nilai default kolom. Informasi utama tentang kolom disimpan di pg_attribute (Lihat di bawah). Hanya kolom yang secara eksplisit menentukan nilai default (ketika tabel dibuat atau kolom ditambahkan) yang akan memiliki entri di sini.

'table1'::regclass menggunakan search_path untuk menyelesaikan nama, yang menghindari ambiguitas. Anda dapat memenuhi syarat skema nama untuk mengesampingkan:'myschema.table1'::regclass .

Terkait:

  • Temukan nama tabel yang dirujuk menggunakan tabel, bidang, dan nama skema
  • Dapatkan nilai default kolom tabel di Postgres?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan ILIKE PostgreSQL dengan SQLAlchemy

  2. Tidak dapat mendekripsi menggunakan pgcrypto dari AES-256-CBC tetapi AES-128-CBC tidak masalah

  3. Kesalahan Heroku PostgreSQL GROUP_BY di aplikasi Rails

  4. Bagaimana saya bisa menggunakan UUID di SQLAlchemy?

  5. Memperbaiki tabel TOAST yang rusak