เหตุผล LNNVL


12

LNNVL เป็น oracle ที่มีอยู่แล้วภายในฟังก์ชันที่ส่งคืน TRUE สำหรับเงื่อนไขที่ประเมินเป็น FALSE หรือ UNKNOWN และส่งคืน FALSE สำหรับเงื่อนไขที่ประเมินเป็น TRUE คำถามของฉันคือสิ่งที่จะได้ประโยชน์จากการคืนตรงกันข้ามกับเงื่อนไขความจริงมากกว่าเพียงแค่จัดการค่า NULL?

ตัวอย่างเช่นสมมติว่าคุณมีตาราง Emp พร้อมคอลัมน์ StartCommission และ CurrentCommission ซึ่งอาจมีค่า Null ผลตอบแทนต่อไปนี้เป็นเพียงแถวที่ไม่มีค่าเป็น null:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission;

หากคุณต้องการรวมแถวที่ค่าคอมมิชชันเป็นโมฆะคุณสามารถทำสิ่งนี้:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission 
OR StartCommission IS NULL OR CurrentCommission IS NULL;

ดูเหมือนว่าฟังก์ชั่นจะมีอยู่เพื่อทำให้ไวยากรณ์สั้นลง แต่การใช้ LNNVL จะส่งกลับระเบียนที่ไม่เท่ากันทั้งหมดและบันทึกทั้งหมดที่มีค่า Null

SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);

การเพิ่ม NOT ลงในแถวนี้จะส่งคืนแถวที่ไม่มีค่า null เท่านั้น สำหรับฉันแล้วดูเหมือนว่าการทำงานที่ต้องการสำหรับกรณีนี้คือการรักษาสภาพที่แท้จริงเป็นจริงเงื่อนไขเท็จเป็นเท็จและมีเงื่อนไขที่ไม่รู้จักประเมินเป็นจริง ฉันได้สร้างกรณีใช้งานน้อยจริง ๆ ที่นี่หรือไม่? มันมีแนวโน้มที่จะต้องการที่จะไม่ทราบว่าเป็นจริงจริงเป็นเท็จและเป็นเท็จจริงหรือไม่

create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into emp values (.2,null);
insert into emp values (.3,.4);

วันนี้ฉันได้พบกับ LNNVL และฉันพยายามค้นหาหรือเข้าใจในส่วนนี้เช่นกัน "สิ่งที่จะเป็นประโยชน์ในการกลับมาตรงกันข้ามกับความจริง" อย่างไรก็ตามคำสั่งที่คุณใช้เพื่อเป็นตัวอย่าง LNNVL ควรใช้ตัวดำเนินการที่ไม่เท่ากัน: SELECT * จากพนักงาน WHERE LNNVL (StartCommission <> CurrentCommission); เพื่อให้ส่งกลับผลลัพธ์เดียวกับคำสั่งที่ใช้ OR กล่าวอีกนัยหนึ่งถ้าเราใช้เงื่อนไขและเราต้องการรวมแถวที่มีค่า NULL เราต้องผ่านการปฏิเสธเงื่อนไขของเราเพื่อ LNNVL
คุณคนเดียวเท่านั้น

อีกตัวอย่างง่ายๆ เฉพาะพนักงานที่ได้รับค่าคอมมิชชั่นน้อยกว่า 20%: SELECT * จากพนักงาน WHERE commission_pct <.2; หากต้องการรวมถึงพนักงานที่ไม่ได้รับค่าคอมมิชชั่นเลย: เลือก * จากพนักงาน WHERE LNNVL (commission_pct> = .2);
คุณคนเดียวเท่านั้น

@OnlyYou - คุณถูกต้องเพื่อให้ LNNVL ทำงานได้เหมือนกันเงื่อนไขจะต้องเป็น <> ฉันทิ้งมันไว้ = มากกว่าเพราะถ้าฟังก์ชั่นส่งคืนผลลัพธ์เดียวกันด้วยเครื่องหมาย = มันจะสมเหตุสมผลมากกว่า โดยพื้นฐานแล้วฟังก์ชั่นนี้มีการดำเนินการสองอย่าง 1. การรวม Null, 2. การสลับบูลีน อดีตทำให้รู้สึกในภายหลังก็ดูเหมือนว่าจะสับสนสิ่งที่ต้องตรงข้ามของเงื่อนไขที่ต้องการ ie = ต้องการ <>, <ต้องการ> =, ฯลฯ
Leigh Riffel

คำตอบ:


6

มันเป็นฟังก์ชั่นแปลก ๆ ที่มีประวัติแปลก ๆ - แต่แล้วก็เป็นเช่นนั้นnvl2แปลก lnnvlมันเป็นis not trueโอเปอเรเตอร์ - ไม่ต้องสงสัยเลยว่ามันสามารถใช้งานได้ดีเหมือนได้nvl2แต่เมื่อคุณต้องมองหาฟังก์ชั่นทุกครั้งที่คุณใช้มันเพื่อเตือนคุณว่ามันทำอะไรอยู่nvl, coalesce, decodeและnullifพร้อมกับcaseการแสดงออกซึ่งเป็นงานง่ายมากขึ้น


ฉันไม่พบ NVL2 ที่แปลก แต่แล้วฉันก็ใช้มันเยอะและฉันก็ไม่เคยใช้ LNNVL
Leigh Riffel

@Leigh - ฉันคิดว่าคุณต้องใช้มันบ่อยพอที่จะทำให้มันไม่แปลก :) ฉันไม่เคยใช้nullifจนกว่าฉันจะรู้ว่ามันจะช่วยได้มากในการแบ่ง 'ศูนย์ด้วยศูนย์' = null คุณพบ nvl2 (a, c, b) ดีกว่าการถอดรหัส (a, null, b, c) หรือไม่
แจ็คบอกว่าลอง topanswers.xyz

4

ใช้วิธีนี้ฉันยังไม่เคยใช้ LNNVL มาหลายปีในการเป็นโปรแกรมเมอร์ DBA และ PL / SQL ฉันเคยใช้ NVL2 เป็นครั้งคราว (และมักจะต้องหาว่าด้านไหนเป็นเรื่องจริงเสมอไปและด้านไหนไม่ได้) จากจุดนั้นดูเหมือนว่าจะดีขึ้นจากมุมมองการอ่านเพื่อจบลงด้วยการใช้ NVL, ถอดรหัส, กรณี ฯลฯ

อีกวิธีหนึ่งคือการทำงานสมมติว่าหนึ่งมีการจัดการที่ดีเกี่ยวกับวิธีที่ออราเคิลจัดการกับ NULL และเลขคณิต แต่ ณ จุดนี้เราอาจใช้แบบสอบถามต้นฉบับของคุณเพื่ออ่านได้ (และแผนการดำเนินการอาจใช้เวลามากขึ้นเช่นกัน):

/* Return all rows where StartCommission is the same
 * as Current Commission, or those rows who have a
 * NULL in either (including both)
 */

SELECT *
  FROM Emp
 WHERE StartCommission = CurrentCommission
    OR StartCommission + CurrentCommission IS NULL

-- NULL + NULL, or NULL + Number is always NULL; hence return either
-- those records that are equal, or have a combined total of NULL
-- (either or both fields will be NULL).

คุณหมายถึงStartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULLอะไร
แจ็คบอกว่าลอง topanswers.xyz

@JackPDouglas - มันสมเหตุสมผลแล้วที่ =
Leigh Riffel

รูปแบบที่น่าสนใจ ฉันเห็นด้วยกับข้อสรุปของคุณ
Leigh Riffel

@Leigh - lnnvlฉันเห็นทางเลือกให้กับฟังก์ชั่นที่คุณต้องการได้เป็นทางเลือกให้กับ
แจ็คบอกว่าลอง topanswers.xyz

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