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

SQL Server COALESCE () Dijelaskan

Di SQL Server, COALESCE() ekspresi mengembalikan argumen non-null pertamanya.

Cara kerjanya adalah, kami meneruskan daftar argumen ke ekspresi, mengevaluasi argumen secara berurutan dan mengembalikan nilai saat ini dari ekspresi pertama yang awalnya tidak mengevaluasi ke NULL .

Sintaks

Sintaksnya seperti ini:

COALESCE ( expression [ ,...n ] )

Contoh

Berikut adalah contoh sederhana untuk ditunjukkan:

SELECT COALESCE(null, 'Cat', 'Dog');

Hasil:

Cat

Dalam hal ini, Cat adalah argumen non-NULL pertama, jadi COALESCE() mengembalikan nilai tersebut.

Ekspresi

Seperti disebutkan, COALESCE() mengembalikan nilai saat ini dari ekspresi pertama yang awalnya tidak dievaluasi ke NULL . Oleh karena itu, jika kita memberikan ekspresi seperti ini:

SELECT COALESCE( null, 2 * 3 );

Kami mendapatkan ini:

6

Fungsi mengembalikan tipe data ekspresi dengan prioritas tipe data tertinggi. Jika semua ekspresi tidak dapat dibatalkan, hasilnya akan diketik sebagai tidak dapat dibatalkan.

Ketika Semua Argumen NULL

Jika semua argumen adalah NULL , COALESCE() mengembalikan NULL . Namun, setidaknya satu dari nilai nol harus diketik NULL , jika tidak akan terjadi kesalahan.

Dengan kata lain, tidak semuanya bisa menjadi NULL konstan:

SELECT COALESCE( null, null );

Kami mendapatkan ini:

Msg 4127, Level 16, State 1, Line 1
At least one of the arguments to COALESCE must be an expression that is not the NULL constant.

Dalam hal ini, semua argumen adalah NULL konstan, dan kesalahan dikembalikan.

Di bawah ini adalah contoh database untuk mendemonstrasikan skenario di mana COALESCE() mengembalikan NULL ketika semua argumen adalah NULL .

Misalkan kita menjalankan kueri berikut:

SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Hasil:

CustomerId  CustomerCategoryId
----------- ------------------
NULL        NULL

Kedua kolom berisi NULL nilai.

Jadi jika kita meneruskan kedua kolom ke COALESCE() , kita mendapatkan hasil dari NULL :

SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Hasil:

NULL

Hal yang sama berlaku jika kita mengganti salah satu kolom dengan NULL konstan:

SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Hasil:

NULL

Jadi hanya ketika semua argumennya adalah NULL konstan sehingga kita mendapatkan kesalahan.

Ganti NULL Hasil dengan Nilai yang Diketahui

Kami dapat menyertakan nilai yang diketahui sebagai argumen terakhir untuk mengganti hasil NULL apa pun dengan nilai yang diketahui itu.

Misalnya, kueri berikut mengembalikan NULL :

SELECT SUM( UnitPrice ) 
FROM Sales.SpecialDeals;

Hasil:

NULL

Dalam hal ini, UnitPrice kolom berisi nilai NULL di semua baris, dan hasilnya adalah NULL .

Kita bisa menggunakan COALESCE() seperti ini:

SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;

Hasil:

0.00

Sekarang, hasil NULL diganti dengan nilai yang diketahui (nol).

COALESCE() vs CASE

COALESCE() ekspresi sebenarnya adalah pintasan sintaksis untuk CASE ekspresi. Saat kita menggunakan COALESCE() ekspresi, pengoptimal kueri menulis ulang sebagai CASE ekspresi.

Ketika saya menjalankan pernyataan berikut:

SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Pengoptimal kueri menulis ulang sebagai berikut:

CASE 
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] 
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID] 
END

COALESCE() vs ISNULL()

Dalam beberapa hal, COALESCE() ekspresinya mirip dengan ISNULL() fungsi. Tapi ada perbedaan. Khususnya:

  • ISNULL() adalah fungsi dan dievaluasi hanya sekali. COALESCE() di sisi lain, adalah ekspresi, dan berpotensi dapat dievaluasi beberapa kali.
  • Penentuan tipe data dari ekspresi yang dihasilkan berbeda. ISNULL menggunakan tipe data parameter pertama, COALESCE mengikuti CASE aturan ekspresi dan mengembalikan tipe data nilai dengan prioritas tertinggi.
  • Kemampuan NULL dari ekspresi hasil berbeda untuk ISNULL dan COALESCE . ISNULL nilai kembalian selalu dianggap NOT NULLable (dengan asumsi nilai kembalian adalah non-nullable). Sebaliknya,COALESCE dengan parameter non-null dianggap NULL .
  • Validasi untuk ISNULL dan COALESCE juga berbeda. Misalnya, NULL nilai untuk ISNULL diubah menjadi int meskipun untuk COALESCE , Anda harus memberikan tipe data.
  • ISNULL hanya membutuhkan dua parameter. Sebaliknya COALESCE mengambil sejumlah variabel parameter.

Informasi Lebih Lanjut

Lihat dokumentasi Microsoft untuk detail lebih lanjut dan contoh yang lebih kompleks.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghindari satu kutipan di SQL Server?

  2. Sisipkan beberapa baris TANPA mengulangi bagian INSERT INTO ... dari pernyataan?

  3. Bagaimana Anda menghapus log transaksi SQL Server?

  4. Apa perbedaan antara indeks berkerumun dan tidak berkerumun?

  5. Mengapa CTE lebih baik daripada kursor/tabel turunan/subqueries/tabel temp dll?