กรณีเมื่อเทียบกับ isnull เมื่อเทียบกับการรวมกัน


9

ฉันเพิ่งอ่านเอกสารประกอบสำหรับการสอบ SQL Server 2012 และฉันเห็นประเด็นต่อไปนี้:

กรณีเมื่อเทียบกับ isnull เมื่อเทียบกับการรวมกัน

ตอนนี้ฉันรู้วิธีที่จะใช้แต่ละคน แต่ฉันไม่รู้ว่าเมื่อไหร่ที่จะใช้แต่ละคน ได้โปรดร่างกายบางคนชี้แจง ขอบคุณ

ps ได้โปรดเรามีแท็กสำหรับคำถามการสอบได้ไหม


2
COALESCEขยายออกไปCASEแต่เห็นได้ชัดในCASEข้อความที่คุณเขียนเองว่าคุณสามารถยืดหยุ่นได้มากขึ้นในWHENเงื่อนไข สำหรับISNULLvs COALESCE ที่เกี่ยวข้อง / ซ้ำกัน?
Martin Smith

ที่เกี่ยวข้องฉันเห็นด้วย แต่ไม่ซ้ำซ้อน ขอบคุณสำหรับความคิดเห็น :)
Stuart Blackler

คำตอบ:


10

ISNULL - ใช้ได้เฉพาะใน SQL Server อนุญาตให้ทำการทดสอบและแทนที่ค่า NULL ด้วยค่าอื่น

COALESCE - มาตรฐาน ANSI อนุญาตสำหรับการทดสอบและการแทนที่ค่า NULL ด้วยค่าที่ไม่ใช่ค่า null แรกในชุดอาร์กิวเมนต์ที่มีความยาวผันแปรได้ เป็นสิ่งสำคัญที่จะต้องทราบว่าปัจจัยการตรวจสอบข้อมูลประเภทนี้

-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1) 
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')

ในตัวอย่างข้างต้น 'a' เป็นค่าที่ไม่ใช่ค่าแรก แต่ข้อมูลตัวอักษรมีลำดับความสำคัญต่ำกว่าจำนวนเต็ม

ข้อพิจารณาอีกอย่างระหว่าง ISNULL กับ COALESCE คือผลลัพธ์ของ ISNULL ถูกพิจารณาว่าไม่เป็น NULL ในขณะที่ผลลัพธ์ของการโทร COALESCE นั้นเป็น NULLable ดูโพสต์ของ JRJ ISNULL () <> COALESCE ()ในขณะที่อาจเป็นเรื่องเล็กน้อย แต่เครื่องมือเพิ่มประสิทธิภาพการสืบค้นสามารถสร้างแผนที่แตกต่างกันโดยขึ้นอยู่กับความสามารถของคอลัมน์

คุณสามารถทดสอบความสามารถในการลบล้างของนิพจน์ isnull / coalesce / case ได้อย่างง่ายดายโดยเรียกใช้ผ่าน dmo sys.dm_exec_describe_first_result_set

-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
    DMO.*
FROM
    sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO

กรณี - นอกจากนี้ยังมีฟังก์ชันสเกลาร์มาตรฐาน ANSI ฉันจะดูการใช้ CASE ในสองข้อก่อนหน้านี้เมื่อฉันมีการทดสอบที่ไม่สามารถแสดงออกด้วยสเกลาร์ที่เรียบง่าย แต่นั่นเป็นคำตอบที่ค่อนข้างอ่อนแอฉันยอมรับ


ขอบคุณสำหรับคำตอบที่สมบูรณ์อย่างรวดเร็ว ฉันไม่รู้ว่าลำดับความสำคัญมาCOALESCEก่อน ขอขอบคุณอีกครั้ง
Stuart Blackler

1
CASEในทางเทคนิคเป็นการแสดงออกไม่ใช่ฟังก์ชั่น
ypercubeᵀᴹ

1

ISNULL ให้ความเป็นไปได้ในการส่งคืน 1 repalcement, COALESCE ไม่ จำกัด เพียงหนึ่งค่าเช่นCOALESCE(v1,v2,v3,v4,v5) ถ้า V5 เป็นค่าเดียวที่ไม่ใช่ค่า NULL มันจะถูกส่งกลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.