अधिकांश प्रमुख RDBMS NULLIF()
. का समर्थन करते हैं ऑपरेटर, जो NULL
returns लौटाता है यदि इसके दोनों तर्क समकक्ष हैं। यदि तर्क समकक्ष नहीं हैं, NULLIF()
पहला तर्क देता है।
NULLIF()
एक SQL-मानक विशेषता है (यह ISO/IEC 9075 विनिर्देश में शामिल है)।
सिंटैक्स
वाक्य रचना इस प्रकार है:
NULLIF (V1, V2)
यह निम्न CASE
के बराबर है अभिव्यक्ति:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
उदाहरण
प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है:
SELECT NULLIF( 12, 12 );
परिणाम:
NULL
इस मामले में, दोनों तर्क समान हैं और इसलिए परिणाम NULL
. है ।
आपके RDBMS के आधार पर, NULL मानों के लिए वास्तविक आउटपुट भिन्न हो सकता है। उदाहरण के लिए, psql (PostgreSQL के लिए) का उपयोग करते समय, जब भी कोई NULL मान लौटाया जाता है, तो खाली स्ट्रिंग डिफ़ॉल्ट रूप से आउटपुट होती है (हालाँकि इसे बदला जा सकता है)। SQLite के साथ भी ऐसा ही है (और इसे बदला भी जा सकता है)।
जब तर्क समतुल्य न हों
यहां बताया गया है कि जब तर्क समकक्ष नहीं होते हैं तो क्या होता है:
SELECT NULLIF( 12, 13 );
परिणाम:
12
तर्क अलग हैं और इसलिए पहला तर्क दिया जाता है।
स्ट्रिंग्स
यहां एक उदाहरण दिया गया है जो स्ट्रिंग की तुलना करता है:
SELECT
NULLIF( 'Gym', 'Gym' ) AS "Same",
NULLIF( 'Gym', 'Bag' ) AS "Different";
परिणाम:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Gym | +------+-----------+
तिथियां
यहां एक उदाहरण दिया गया है जो तिथियों की तुलना करता है:
SELECT
NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";
परिणाम:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2045-11-25 | +------+------------+
अभिव्यक्ति
NULLIF()
भावों के वर्तमान मूल्य का मूल्यांकन करता है। इसलिए, अगर हम इस तरह से एक व्यंजक पास करते हैं:
SELECT NULLIF( 24, 2 * 12 );
हमें यह मिलता है:
NULL
2 को 12 से गुणा करने पर 24 है, और इसलिए दोनों तर्क बराबर हैं।
यदि हम दूसरा तर्क बदलते हैं तो यहां क्या होता है:
SELECT NULLIF( 24, 3 * 12 );
परिणाम:
24
पहला तर्क वापस कर दिया गया है।
एक डेटाबेस उदाहरण
मान लीजिए कि हम निम्नलिखित क्वेरी चलाते हैं:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
ORDER BY Name;
परिणाम:
+------------------+-------------------+ | Name | LocalName | +------------------+-------------------+ | Argentina | Argentina | | Bolivia | Bolivia | | Brazil | Brasil | | Chile | Chile | | Colombia | Colombia | | Ecuador | Ecuador | | Falkland Islands | Falkland Islands | | French Guiana | Guyane française | | Guyana | Guyana | | Paraguay | Paraguay | | Peru | Perú/Piruw | | Suriname | Suriname | | Uruguay | Uruguay | | Venezuela | Venezuela | +------------------+-------------------+
यहां, हमारे पास बाएं कॉलम में देश के नाम हैं, और संबंधित देश के लिए स्थानीय नाम दाईं ओर है।
आइए जोड़ें NULLIF()
हमारी क्वेरी के तीसरे कॉलम में:
SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country
WHERE Region = 'South America'
ORDER BY Name;
परिणाम:
+------------------+-------------------+-------------------------+ | Name | LocalName | Local Name if Different | +------------------+-------------------+-------------------------+ | Argentina | Argentina | NULL | | Bolivia | Bolivia | NULL | | Brazil | Brasil | Brasil | | Chile | Chile | NULL | | Colombia | Colombia | NULL | | Ecuador | Ecuador | NULL | | Falkland Islands | Falkland Islands | NULL | | French Guiana | Guyane française | Guyane française | | Guyana | Guyana | NULL | | Paraguay | Paraguay | NULL | | Peru | Perú/Piruw | Perú/Piruw | | Suriname | Suriname | NULL | | Uruguay | Uruguay | NULL | | Venezuela | Venezuela | NULL | +------------------+-------------------+-------------------------+
हम देख सकते हैं कि तीसरा कॉलम स्थानीय नाम तभी लौटाता है, जब वह Name
के मान से अलग हो कॉलम। अगर ऐसा ही है, तो NULL
लौटा दिया गया है।
हम NULLIF()
. का भी उपयोग कर सकते हैं हमारे क्वेरी परिणामों को फ़िल्टर करने के लिए:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
परिणाम:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
इस मामले में, हमने केवल उन पंक्तियों को लौटाया है जहां स्थानीय नाम Name
. से भिन्न है कॉलम।
NULLIF()
बनाम CASE
जैसा कि बताया गया है, निम्नलिखित कोड:
NULLIF (V1, V2)
निम्नलिखित CASE
के बराबर है अभिव्यक्ति:
CASE WHEN V1=V2 THEN NULL ELSE V1 END
इसलिए CASE
. का उपयोग करना संभव है NULLIF()
. के बजाय एक्सप्रेशन यदि ऐसा वांछित है। NULLIF()
फ़ंक्शन मूल रूप से CASE
. के लिए एक वाक्य रचनात्मक शॉर्टकट है अभिव्यक्ति।
इसलिए उदाहरण के लिए, हम पिछले उदाहरण को निम्नलिखित से बदल सकते हैं:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'South America'
AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
ORDER BY Name;
परिणाम:
+---------------+-------------------+ | Name | LocalName | +---------------+-------------------+ | Brazil | Brasil | | French Guiana | Guyane française | | Peru | Perú/Piruw | +---------------+-------------------+
हालांकि, NULLIF()
फ़ंक्शन बहुत अधिक संक्षिप्त है।
गलत पैरामीटर गणना
तर्कों की गलत संख्या पास करने से त्रुटि होती है:
SELECT NULLIF( 'One' );
MySQL में परिणाम:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'