Apa cara terbaik untuk memeriksa apakah nilainya null atau string kosong dalam pernyataan Postgres sql?
Nilai dapat berupa ekspresi yang panjang sehingga lebih disukai ditulis hanya sekali dalam pemeriksaan.
Saat ini saya menggunakan:
coalesce( trim(stringexpression),'')=''
Tapi itu terlihat agak jelek.
stringexpression
bisa berupa char(n)
kolom atau ekspresi yang mengandungchar(n)
kolom dengan spasi tambahan.
Apa cara terbaik?
char
hampir selalu merupakan pilihan yang salah karena padding (dan menghasilkan ruang buang). Namun terlepas dari itu: Saya tidak berpikir ada solusi yang lebih baik.Jawaban:
Ekspresi
stringexpression = ''
menghasilkan:TRUE
.. untuk''
(atau untuk string apa pun yang hanya terdiri dari spasi dengan tipe datachar(n)
)NULL
.. untukNULL
FALSE
.. untuk hal lainJadi untuk memeriksa: "
stringexpression
apakah NULL atau kosong" :Atau pendekatan sebaliknya (mungkin lebih mudah dibaca):
Bekerja untuk semua jenis karakter termasuk
char(n)
. Manual tentang operator perbandingan.Atau gunakan ekspresi asli Anda tanpa
trim()
, yang merupakan noise mahal untukchar(n)
(lihat di bawah), atau salah untuk tipe karakter lain: string yang hanya terdiri dari spasi akan dilewatkan sebagai string kosong.Tetapi ekspresi di atas lebih cepat.
Menyatakan yang sebaliknya bahkan lebih sederhana: "
stringexpression
bukan NULL atau kosong" :Tentang
char(n)
Ini adalah tentang tipe data
char(n)
, singkatan:character(n)
. (char
/character
kependekan darichar(1)
/character(1)
.) Penggunaannya tidak disarankan di Postgres :Jangan bingung
char(n)
dengan tipe karakter lain yang bergunavarchar(n)
,varchar
,text
atau"char"
(dengan tanda kutip ganda).Dalam
char(n)
sebuah string kosong tidak berbeda dari string lain yang terdiri dari ruang saja. Semua ini dilipat menjadi n spasi dichar(n)
per definisi jenis. Secara logis berikut bahwa ekspresi di atas berfungsichar(n)
juga - sama seperti ini (yang tidak akan bekerja untuk tipe karakter lain):Demo
String kosong sama dengan string spasi apa pun saat dilemparkan ke
char(n)
:Hasil:
Uji "string kosong atau kosong" dengan
char(n)
:Hasil:
Uji "string kosong atau kosong" dengan
text
:Hasil:
db <> biola di sini
Old sqlfiddle
Terkait:
sumber
best way to check if value is null or empty string
. Thetrim()
panggilan (relatif) mahal - dan hanya tidak perlu. Saya menambahkan lebih banyak tentangchar(n)
dan "string kosong".''
. Dapatkah saya menghapus trim dan gunakancoalesce(stringexpression,'')=''
untuk memeriksa. Ini terlihat lebih mudah dibaca dibandingkan jawaban Anda.select coalesce(' ', '') = ''
mengembalikan salah. Jadi TRIM () diperlukancoalesce(' '::char(5), '') = ''
tidak. Saya akan menggunakan salah satu dari dua ekspresi teratas dalam hal apa pun, yang berfungsi untuk semua jenis karakter dan tercepat dan terbersih.Untuk memeriksa nol dan kosong:
Untuk memeriksa null, kosong, dan spasi (pangkas string)
sumber
Memeriksa panjang string juga berfungsi dan kompak:
sumber
where length(stringexpression) = 0;
. Ini bekerja untuk saya.Jika mungkin ada ruang trailing kosong, mungkin tidak ada solusi yang lebih baik.
COALESCE
hanya untuk masalah seperti milikmu.sumber
Sesuatu yang saya lihat digunakan orang
stringexpression > ''
. Ini mungkin bukan yang tercepat, tetapi kebetulan salah satu yang terpendek.Mencobanya di MS SQL dan juga PostgreSQL.
sumber
cara lain adalah
sumber
Cara yang saya pilih untuk membandingkan bidang yang dapat dibatalkan adalah: NULLIF (nullablefield,: ParameterValue) IS NULL DAN NULLIF (: ParameterValue, nullablefield) IS NULL. Ini rumit tetapi digunakan secara universal sementara Coalesce tidak mungkin dalam beberapa kasus.
Penggunaan NULLIF kedua dan kebalikan adalah karena "NULLIF (nullablefield,: ParameterValue) IS NULL" akan selalu mengembalikan "true" jika parameter pertama adalah null.
sumber
Jika database memiliki sejumlah besar catatan maka
null check
dapat mengambil lebih banyak waktu Anda dapat menggunakan cek kosong dengan cara yang berbeda seperti: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
sumber
Banyak jawaban adalah cara terpendek, bukan cara terbaik jika kolom memiliki banyak nol. Menghentikan pemeriksaan memungkinkan pengoptimal untuk mengevaluasi pemeriksaan lebih cepat karena tidak harus melakukan pekerjaan pada kondisi lainnya.
Perbandingan string tidak perlu dievaluasi karena kondisi pertama salah.
sumber