Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Berurusan dengan NULL di SQL Server

Apa itu NULL? NULL atau penanda NULL adalah cara kami mewakili nilai yang tidak diketahui dalam SQL, dengan SQL saya mengacu pada Bahasa Kueri Terstruktur standar, bukan MS SQL Server. Kalimat terakhir membawa kita kembali ke tahun 1969 ketika standar pertama kali didefinisikan oleh Dr. E.F. Codd. NULL menjadi perlu karena kita perlu berpikir dalam kerangka apa yang disebut logika predikat tiga nilai. Predikat adalah properti dari ekspresi yang memegang atau tidak memegang. Pada nilai nominal, orang akan memikirkan dua kemungkinan:BENAR atau SALAH. Namun, ada kemungkinan ketiga:TIDAK DIKETAHUI.

Mari kita ambil contoh. Dengan asumsi atribut (kolom) dalam hubungan kami (Tabel) mewakili Nomor Identifikasi Pajak (TIN) dari satu set pemilik Usaha Kecil di Accra, Ghana. Kolom untuk setiap catatan pemilik bisnis akan diisi dengan NPWP-nya dan kita dapat menggunakan kolom ini untuk menentukan beberapa atribut lain seperti apakah dia mutakhir dalam pembayaran Pajak. Namun, ada dua kemungkinan tambahan dalam kasus penggunaan ini:

  1. Pemilik Bisnis memiliki NPWP dan terbaru.
  2. Pemilik Bisnis tidak memiliki NPWP dan (jelas) tidak mutakhir.

Di atas menjelaskan apa yang disebut oleh Dr. Codd sebagai logika predikat empat nilai. Standar SQL, bagaimanapun, menyederhanakan dua kondisi tambahan ini dengan mendefinisikannya sebagai tidak diketahui yaitu NULL. Kami tidak mengetahui NPWP pemilik bisnis dan tidak dapat menentukan nilai lain dari atribut Pemilik Bisnis yang terpengaruh. Jadi, NULL adalah UNKNOWN dan merupakan nilai ketiga dalam logika predikat tiga nilai standar.

NULL Istimewa

Definisi NULL memerlukan perlakuan penanda dengan cara yang berbeda dari nilai sebenarnya. Berikut ini adalah contohnya:

  1. Tidak ada filter “WHERE =NULL;”. Ekspresi yang benar adalah "WHERE IS NULL;". Hal yang sama berlaku untuk ekspresi sebaliknya.
  2. Saat mengurutkan SQL dalam urutan menaik, Anda dapat memilih untuk mencantumkan NULL terlebih dahulu atau terakhir. Standarnya adalah mencantumkan NULL terlebih dahulu.
  3. Anda tidak dapat membandingkan nilai NULL. Ini harus jelas karena kami telah mengatakan bahwa NULL TIDAK DIKETAHUI.
  4. Bila upaya penggabungan melibatkan kolom NULL, hasilnya adalah NULL.

Fungsi Umum Terkait NULL

Berikut ini adalah tiga fungsi umum terkait NULL di SQL Server

ISNULL

ISNULL – Menggantikan NULL dengan nilai pengganti yang ditentukan. Daftar 1 dan Gambar 1 menunjukkan contoh sederhana ISNULL.

-- Listing 1: Simple Example of ISSNULL
SELECT ISNULL (NULL, 3) NULLREPLACEMENT;
SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;
SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;

Gambar 1:Contoh Sederhana ISNULL

NULLIF

NULLIF kembali NULL adalah nilai dari dua argumen yang sama.

-- Listing 2: Simple Example of NULLIF
SELECT NULLIF(3,3) AS NULLIFF;
SELECT NULLIF(3,5) AS NULLIFF;
SELECT NULLIF('RED','RED') AS NULLIFF;
SELECT NULLIF('GREEN','RED') AS NULLIFF;

Gambar 2:Contoh Sederhana NULLIF

COALESCE

COALESCE mengembalikan nilai non-NULL pertama dari daftar yang disediakan. Daftar 1 menunjukkan contoh ini dan Gambar 1 menunjukkan output dari kueri.

-- Listing 3: Simple Example of COALESCE
SELECT COALESCE (NULL,'','GREEN','','') AS NULLRESPONSE;
SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE;
SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;

Gambar 3:Contoh Sederhana Penggabungan

Perhatikan bahwa contoh-contoh sederhana ini mengekspos untuk menggunakan sifat NULL. NULL dan ruang kosong TIDAK sama. Dalam pernyataan pertama, COALESCE mengembalikan ruang kosong yang menunjukkan kepada kita bahwa ruang kosong adalah nilai non-NULL pertama dalam daftar.

Perbedaan antara ISNULL dan COALESCE

Perbedaan antara ISNULL dan COALESCE telah menjadi subyek dari beberapa artikel online serta buku-buku seperti yang tercantum di bagian referensi. Perbedaan tersebut diringkas sebagai berikut:

  1. ISNULL adalah milik SQL Server sementara COALESCE adalah fungsi standar ANSI. Ini menyiratkan bahwa untuk portabilitas, COALESCE lebih disukai.
  2. ISNULL hanya membutuhkan dua argumen sedangkan COALESCE dapat mengambil lebih dari dua argumen.
  3. Tipe data dari nilai yang dikembalikan oleh ISNULL ditentukan oleh tipe data dari argumen pertama sedangkan tipe data dari nilai yang dikembalikan oleh COALESCE ditentukan oleh tipe data dalam daftar dengan prioritas tertinggi.
  4. Saat kedua fungsi digunakan dengan subkueri, ISNULL bekerja lebih baik karena COALESCE diterjemahkan secara internal ke ekspresi CASE sehingga pemindaian cenderung berulang.

Itzik Ben-Gan juga mengeksplorasi implikasi lain dari konversi COALESCE ke ekspresi kasus dalam artikelnya tautan yang disediakan di akhir artikel ini.

Contoh Kasus Penggunaan

Kami ingin menampilkan di portal web daftar pelanggan berdasarkan kriteria tertentu dari tabel yang kami buat di Daftar 4. Tugas 1 dan 2 memberikan persyaratan yang memungkinkan dan kami menggunakan ISNULL dan COALESCE untuk memenuhi persyaratan.

--Listing 4: Table Creation Script
CREATE TABLE CUSTOMER 
(ID INT IDENTITY (1,1)
,FIRSTNAME VARCHAR(50)
,LASTNAME VARCHAR(50)
,SEX CHAR(1)
,ADDRESS VARCHAR(300)
,FIRSTTRANDATE DATETIME
,PHONENUMBER1 BIGINT
,PHONENUMBER2 BIGINT
,PHONENUMBER3 BIGINT);
GO

INSERT INTO CUSTOMER VALUES ('KENNETH','IGIRI','M','ACCRA, GHANA',GETDATE(),'0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('RICHARD','HANO','M','BUDAPEST, HUNGARY',GETDATE(),'889189400122',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('GEORGINA','APPIAH','F','ACCRA, GHANA','09-16-2018','02456665678','0275339678',NULL);
INSERT INTO CUSTOMER VALUES ('HOWARD','KLEVIA',NULL,'HAGUE, SWITZERLAND','02-16-2017','3499285782',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('ZEN','GREGOR',NULL,'SHANGHAI, CHINA','06-23-2018','0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);

Gambar 4 Tabel Contoh

Tugas 1 :Mengembalikan Daftar semua pelanggan yang tidak memberikan nomor telepon alternatif.

--Listing 5: Table List of Customers with no Secondary Phones
--A: The Simple Answer
SELECT * FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

--B: Presenting the Result Set Better
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'NO SECONDARY PHONE') AS [SECONDARY PHONE NUMBER]
FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

Menggunakan COALESCE (atau ISNULL), kami dapat menyajikan informasi yang diperlukan dengan lebih baik menggunakan teks yang mengatakan 'No Secondary Phone'.

Gbr. 5 Hasil Set untuk Listing 5

Tugas 2 :Mengembalikan Daftar semua pelanggan, Nomor Telepon utama mereka, dan nomor telepon alternatif lainnya.

--Listing 6: Table List of Customers with an Other Alternate Number
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,COALESCE(CAST(PHONENUMBER2 AS VARCHAR),CAST(PHONENUMBER3 AS VARCHAR), 'NO OTHER PHONE') AS [OTHER PHONE NUMBER]
FROM CUSTOMER  ;

Gbr. 6 Hasil Set untuk Listing 6

Dalam hal ini, ISNULL bukanlah pilihan karena kita melewati tiga argumen.

Kesimpulan

Pada artikel ini, kita telah membahas konsep NULL yang berkaitan dengan logika predikat tiga nilai dan menjelaskan fungsi populer yang kita gunakan di SQL Server untuk menangani kumpulan data yang berisi NULL. Kami juga telah melihat contoh bagaimana fungsi-fungsi ini dapat digunakan. Banyak referensi lain menggali lebih dalam tentang penggunaan, manfaat, dan keterbatasan fungsi-fungsi ini. Saya sangat merekomendasikan buku dan blog Itzik Ben-Gan sebagai sumber informasi yang baik.

Referensi

  • NULLIF (Transact-SQL)
  • COALESCE (Transact-SQL)
  • Artikel Itzik Ben-Gan

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Manajemen Indeks SQL Server Menggunakan Manajer Indeks untuk SQL Server

  2. Salesforce SOQL dari SQL Server

  3. Cara menyisipkan baris di Tabel SQL Server dengan Mengedit Baris Tabel GUI - Tutorial SQL Server / TSQL Bagian 101

  4. Hanya mendapatkan Bulan dan Tahun dari SQL DATE

  5. Jangan Gunakan sp_depends di SQL Server (Sudah Usang)