Apa yang setara dengan PostgreSQL untuk ISNULL ()

255

Di MS SQL-Server, saya bisa melakukan:

SELECT ISNULL(Field,'Empty') from Table

Tetapi dalam PostgreSQL saya mendapatkan kesalahan sintaksis. Bagaimana cara meniru ISNULL()fungsi?

Byron Whitlock
sumber
1
Tidak, Anda tidak dapat melakukannya di MSSQL. Kode itu tidak akan dikompilasi. ISNULLmengambil dua argumen dan mengembalikan yang kedua adalah yang pertama null, jika tidak yang pertama.
GSerg
@ GS, Anda benar. memperbaikinya.
Byron Whitlock
Gserg dan Byron ya Anda dapat melihat di sini Contoh dari PC saya SELECT isnull (a.FechaEntregada, '') sebagai tes dari dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Jawaban:

453
SELECT CASE WHEN field IS NULL THEN 'Empty' ELSE field END AS field_alias

Atau lebih idiomatik:

SELECT coalesce(field, 'Empty') AS field_alias
Kyle Butt
sumber
49
+1 untuk coalesce. (PS Anda juga bisa melakukannya di MS SQL Server.)
Alison R.
2
Ada beberapa kasus lain untuk menggunakan IS NULL, jadi ada baiknya untuk mengetahui keduanya.
Kyle Butt
30
Saya pikir itu perlu dicatat bahwa itu adalah coalesceyang ada di standar SQL, dengan isnullmenjadi fungsi MS-spesifik yang pada dasarnya adalah coalescedengan hanya dua parameter.
GSerg
4
Coalesce () juga menangani promosi jenis dengan benar (persis seperti UNION SELECT), sedangkan IsNull () tidak.
ErikE
2
Perlu ditunjukkan bahwa ISNULL dan COALESCE tidak sama. IsNull memaksa tipe-hasil ke tipe argument1, sementara coalesce menggunakan tipe-tipe tersebut untuk setiap argumen. Jika Anda hanya mencari dan mengganti isnull dengan penggabungan, Anda berpotensi mendapatkan banyak kesalahan ...
Stefan Steiger
76

Gunakan COALESCE()sebaliknya:

SELECT COALESCE(Field,'Empty') from Table;

Fungsinya sangat mirip ISNULL, meskipun menyediakan lebih banyak fungsi. Coalesce akan mengembalikan nilai bukan nol pertama dalam daftar. Jadi:

SELECT COALESCE(null, null, 5); 

mengembalikan 5, sementara

SELECT COALESCE(null, 2, 5);

mengembalikan 2

Coalesce akan mengambil sejumlah besar argumen. Tidak ada maksimum yang didokumentasikan. Saya mengujinya akan 100 argumen dan berhasil. Ini harus banyak untuk sebagian besar situasi.

Jim Clouse
sumber
24

Bagaimana cara meniru fungsionalitas ISNULL ()?

SELECT (Field IS NULL) FROM ...
Artur
sumber
4
Ini mengemulasi fungsionalitas yang tepat dari isnull, tidak yakin mengapa itu
diturunkan
Jawaban terbaik untuk pertanyaan itu, tentu saja. Ekspresi ini setara dengan ISNULL (). COALESCE () sangat cerdas dan menarik untuk diketahui tetapi tidak dapat melakukan ISNULL () saat ditutup.
Skrol29
17
Saya tidak tahu apa yang ISNULLAnda maksud komentator, tetapi field IS NULLmemberikan nilai boolean, sementara ISNULLdi SQL Server beroperasi seperti COALESCE: mengembalikan salah satu dari NULLnilai-nilai. Jawaban ini sangat salah. Lihat dokumentasi: ISNULL.
jpmc26
10
Saya menduga komentator ini adalah pengguna MySQL yang tidak menyadari pertanyaan dimulai dengan, "Dalam MS SQL Server, ..." MySQL memiliki fungsi ISNULL () yang mengambil argumen tunggal dan mengembalikan 0 atau 1. Versi T-SQL mengambil dua argumen dan berperilaku seperti COALESCE atau Oracle NVL.
David Noha
1
greatvovan, Apakah ini maksud dari poster asli atau tidak, saya percaya apa yang orang inginkan adalah jawaban untuk "Bagaimana saya memeriksa apakah suatu bidang adalah nol", belum tentu "Bagaimana tepatnya fungsi fungsi ISNULL bekerja". Itulah yang terjadi pada saya dan jawaban ini sangat cocok untuk itu.
Freeman Helmuth
15

Mencoba:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name
pengguna2718914
sumber
3
Ini bagus karena mencakup kasus ketika bidang teks TIDAK nol, tetapi juga 'kosong'.
soulia
-9

Buat fungsi berikut

CREATE OR REPLACE FUNCTION isnull(text, text) RETURNS text AS 'SELECT (CASE (SELECT $1 "
    "is null) WHEN true THEN $2 ELSE $1 END) AS RESULT' LANGUAGE 'sql'

Dan itu akan berhasil.

Anda dapat membuat versi berbeda dengan tipe parameter berbeda.


sumber
28
Tolong, tidak ada yang melakukan ini. Gunakan coalesce () sebagai gantinya agar DBA Anda tidak membenci Anda.
Jordan
1
postgres tolong tambahkan isnull sehingga tidak ada yang membenci siapa pun.
Eric Twilegar