LNNVL औचित्य


12

LNNVL एक ऐसा फंक्शन है जिसे फंक्शन में बनाया गया है जो FALSE या UNKNOWN के मूल्यांकन की शर्तों के लिए TRUE लौटाता है, और TRUE का मूल्यांकन करने वाली शर्तों के लिए FALSE देता है। मेरा प्रश्न यह है कि केवल NULL मान संभालने के बजाय सत्य स्थिति के विपरीत लौटने का क्या लाभ होगा?

उदाहरण के लिए, मान लीजिए कि आपके पास StartCommission और CurrentCommission कॉलम वाली नलिका है जिसमें नल हो सकते हैं। निम्नलिखित रिटर्न न केवल मूल्य शून्य के साथ पंक्तियाँ:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission;

यदि आप उन पंक्तियों को शामिल करना चाहते हैं जहाँ या तो कमीशन शून्य है तो आप कुछ इस तरह से कर सकते हैं:

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

ऐसा लगता है कि इस वाक्य रचना को छोटा करने के लिए एक फ़ंक्शन मौजूद होगा, लेकिन LNNVL का उपयोग करने से सभी गैर-समान रिकॉर्ड और सभी रिकॉर्ड शून्य के साथ वापस आ जाते हैं।

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

यह जोड़ने के लिए केवल नल के बिना पंक्तियों को नहीं लौटाता है। यह मुझे लगता है कि इस मामले के लिए वांछित कार्यक्षमता सही स्थितियों को सही रखने के लिए होगी, गलत स्थितियों को गलत और सत्य के लिए अज्ञात परिस्थितियों का मूल्यांकन करना होगा। क्या मैंने वास्तव में यहां कम उपयोग का मामला बनाया है? क्या सच में अज्ञात को सच में, असत्य में और असत्य को सत्य में बदलना चाहते हैं?

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 से मिला और मैं इस भाग को जानने या समझने की कोशिश कर रहा हूं कि "सच्चाई के विपरीत लौटने का क्या फायदा होगा"। हालाँकि, आप एलएनएनवीएल को छूट देने के लिए जिस स्टेटमेंट का उपयोग करते हैं, वह नहीं के बराबर ऑपरेटर का उपयोग करना चाहिए: एलएनएनवीएलएल (स्टार्टकॉम्बिशन <> करंटकमिशन) से * से सेक्शन का चयन करें; ताकि यह ओआरएस का उपयोग करके उसी परिणाम के रूप में वापस आए। दूसरे शब्दों में, यदि हम एक शर्त का उपयोग कर रहे हैं और हम NULL मान वाली पंक्तियों को भी शामिल करना चाहते हैं, तो हमें अपनी स्थिति की उपेक्षा को LNNVL में पास करना होगा।
केवल आप

एक और सरल उदाहरण। केवल वे कर्मचारी जो वास्तव में 20% से कम का कमीशन प्राप्त करते हैं: कर्मचारियों से चयन करें * जहाँ से कमीशन_पक्ट <.2; उन कर्मचारियों को भी शामिल किया गया है, जिन्हें कोई कमीशन नहीं मिलता है: * से कर्मचारियों का चयन करें जहां LNNVL (कमीशन_पार्ट> = = 2);
केवल आप

@OnlyYou - आप सही हैं, कि LNNVL को काम करने के लिए उसी हालत में होना पड़ेगा <>। मैंने इसे = अधिक छोड़ दिया क्योंकि यदि फ़ंक्शन ने उसी परिणाम को = चिह्न के साथ वापस किया तो यह अधिक समझ में आता है। अनिवार्य रूप से फ़ंक्शन दो क्रियाएं कर रहा है 1. अशक्त समावेशन, 2. बूलियन टॉगल। पूर्व समझ में आता है, बाद में बस वांछित स्थिति के विपरीत आवश्यक चीजों को भ्रमित करने के लिए लगता है। यानी = के लिए <>, <की आवश्यकता है = =, आदि
लेह रिफ़ेल

जवाबों:


6

यह एक अजीब इतिहास के साथ एक अजीब कार्य है - लेकिन फिर nvl2 अजीब है। lnnvlमूल रूप से एक is not trueऑपरेटर है - इसमें कोई संदेह नहीं है कि इसे अच्छे उपयोग के लिए रखा जा nvl2सकता है, लेकिन जब आपको हर बार किसी कार्य को देखने के लिए उपयोग करना पड़ता है तो यह आपको याद दिलाने के लिए कि यह क्या करता है, आप सोच रहे हैं कि क्या यह छड़ी के लिए सबसे अच्छा है nvl, coalesce, decodeऔर nullifके साथ caseजो अधिक सहज ज्ञान युक्त हैं भाव,


मुझे NVL2 अजीब नहीं लगता है, लेकिन फिर मैं इसका बहुत उपयोग करता हूं और मैंने कभी LNNVL का उपयोग नहीं किया है।
लेह रिफ़ेल

@Leigh - मुझे लगता है कि आपको इसका उपयोग करना होगा अक्सर यह अजीब नहीं होने के लिए पर्याप्त है :) मैंने कभी भी उपयोग नहीं किया nullifजब तक मुझे एहसास नहीं हुआ कि यह 'शून्य से विभाजन' बनाने में बहुत मदद कर सकता है = अशक्त। क्या आप वास्तव में एनवीएल 2 (ए, सी, बी) को डिकोड (ए, नल, बी, सी) से बहुत बेहतर पाते हैं?
जैक का कहना है कि topanswers.xyz

4

इसे इस तरह से रखो, मैंने अभी तक एक बार DBA और PL / SQL प्रोग्रामर होने के कई वर्षों में LNNVL का उपयोग नहीं किया है। मैंने मौके पर NVL2 का उपयोग किया है (और हमेशा यह देखना था कि कौन सा पक्ष सही था, और कौन सा पक्ष नहीं था)। उस बिंदु तक, यह NVL, DECODE, CASE, आदि का उपयोग करके एक पठनीयता के दृष्टिकोण से बेहतर लगता है।

वैकल्पिक रूप से, यह काम करता है, यह मानते हुए कि ओरेकल NULLs और अंकगणित को कैसे संभालता है, इस पर एक अच्छा हैंडल है, लेकिन इस बिंदु तक, कोई भी पठनीयता के लिए आपकी मूल क्वेरी का उपयोग कर सकता है (और निष्पादन योजना एक कठिन हिट भी ले सकती है):

/* 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?
जैक का कहना है कि शीर्षासनवासियों की कोशिश करें ।xyz

@JackPDouglas - यह समझ में आता है =।
लेह रिफ़ेल

दिलचस्प बदलाव। मैं आपके निष्कर्ष से सहमत हूं।
लेह रिफ़ेल

@Leigh - मैं देख रहा हूँ, फ़ंक्शन का एक विकल्प जो आप चाहते हैं, एक विकल्प नहीं lnnvl
जैक कहते हैं कि topanswers.xyz

@JackPDouglas - मैं समझता हूं और मुझे लगता है कि केरी का इरादा यही है।
लेह रिफ़ेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.