MySQL में यह ऑपरेटर <=> क्या है?


163

मैं पिछले डेवलपर द्वारा लिखे गए कोड पर काम कर रहा हूं और एक क्वेरी में यह कहता है,

WHERE p.name <=> NULL

<=>इस क्वेरी में क्या मतलब है? क्या यह कुछ के बराबर है =? या यह एक वाक्यविन्यास त्रुटि है?

लेकिन यह कोई त्रुटि या अपवाद नहीं दिखा रहा है। मैं पहले से ही जानते हैं कि <>= !=में MySQL



4
@ Mhd.Tahawi, हमें एक Google की आवश्यकता है जो हमें सीधे ऑपरेटरों के लिए Google की अनुमति देता है।
पचेरियर

@Pacerier - मुझे यह मिला, कुछ 5 साल पहले symbolhound.com (अगर कोई बेहतर विकल्प है तो डननो )
एंड्रयू

जवाबों:


239

टी एल; डॉ

यह NULLसुरक्षित समान ऑपरेटर है।

नियमित =ऑपरेटर की तरह, दो मूल्यों की तुलना की जाती है और परिणाम या तो 0(बराबर नहीं) या 1(बराबर) होता है; दूसरे शब्दों में: 'a' <=> 'b'पैदावार 0और 'a' <=> 'a'पैदावार 1

नियमित =ऑपरेटर के विपरीत , मूल्यों का NULLकोई विशेष अर्थ नहीं है और इसलिए यह कभी भी NULLसंभावित परिणाम के रूप में नहीं आता है ; इसलिए: 'a' <=> NULLपैदावार 0और NULL <=> NULLपैदावार 1

उपयोगिता

यह तब उपयोगी हो सकता है जब दोनों ऑपरेंड शामिल हो सकते हैं NULLऔर आपको दो कॉलम के बीच एक सुसंगत तुलना परिणाम की आवश्यकता होती है।

एक अन्य उपयोग-मामला तैयार बयानों के साथ है, उदाहरण के लिए:

... WHERE col_a <=> ? ...

यहां, प्लेसहोल्डर या तो स्केलर मान हो सकता है या NULLक्वेरी के बारे में कुछ भी बदलने के बिना हो सकता है।

संबंधित संचालक

इसके अलावा <=>वहाँ भी दो अन्य ऑपरेटरों के खिलाफ तुलना करने के लिए इस्तेमाल किया जा सकता हैं NULL, अर्थात् IS NULLऔर IS NOT NULL; वे ANSI मानक का हिस्सा हैं और इसलिए अन्य डेटाबेस पर समर्थित हैं, इसके विपरीत <=>, जो MySQL-specific है।

आप उन्हें MySQL की विशेषज्ञता के रूप में सोच सकते हैं <=>:

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

इसके आधार पर, आपकी विशेष क्वेरी (टुकड़ा) को और अधिक पोर्टेबल में परिवर्तित किया जा सकता है:

WHERE p.name IS NULL

सहयोग

SQL: 2003 मानक ने इसके लिए एक विधेय प्रस्तुत किया, जो बिल्कुल MySQL के <=>ऑपरेटर की तरह काम करता है , निम्न रूप में:

IS [NOT] DISTINCT FROM 

निम्नलिखित सार्वभौमिक रूप से समर्थित है, लेकिन सापेक्ष जटिल है:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
तो इसका मतलब है कि कोई अंतर नहीं है? और यह <=>कुछ हद तक बेकार ऑपरेटर है? सही?
zzlalani

16
@zzlalani बिल्कुल नहीं; केवल एक लेता है, <=>जबकि दो ऑपरेंड IS (NOT) NULLलेता है; बड़ा अंतर ... यह =अपने आप में उतना ही उपयोगी है ।
'

12
@zzlalani IS NULLऔर IS NOT NULLSQL मानक में हैं। <=>एक MySQL विशिष्ट एक्सटेंशन है।
डैनियल डिनिएज

5
तो, is not distinct fromऑपरेटर की तरह । यह जानने के लिए उत्सुक हैं कि क्या MySQL उस पर एक इंडेक्स का उपयोग कर सकता है ...
डेनिस डी बर्नार्डी

3
@Pacerier नहीं, का विलोम a <=> bहै NOT(a <=> b)
जेक

57

है <=> NULL-safe equal to operator

यह ऑपरेटर = ऑपरेटर की तरह एक समानता तुलना करता है, लेकिन NULL के बजाय 1 लौटाता है यदि दोनों ऑपरेशन्स NULL हैं, और NULL के बजाय 0 यदि कोई ऑपरेंड NULL है।

प्रलेखन के लिए यहाँ देखें

नमूना:

आपको IS NOT NULL का उपयोग करना चाहिए। (तुलना ऑपरेटर = और <> दोनों अभिव्यक्ति के दोनों ओर NULL के साथ UNKNOWN देते हैं।)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

शून्य सुरक्षित समानता ऑपरेटर को भी नकार सकता है लेकिन यह मानक SQL नहीं है।

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

1
सुधार: <=>बुलाया जाना चाहिए बराबर ऑपरेटर और =है NULLअसुरक्षित बराबर ऑपरेटर।
पचेरियर

26

यह ऑपरेटर के बराबर NULL-safe है

खेतों के साथ NULL मानों की तुलना करने के लिए <=> ऑपरेटर का उपयोग किया जाता है। यदि सामान्य = (बराबर) ऑपरेटर संचालक NULL को लौटाता है यदि तुलना मूल्य में से एक NULL है। के साथ <=> ऑपरेटर सही या गलत रिटर्न देता है। <=> ऑपरेटर IS NULL के समान है।

मैनुअल से: -

<=> = ऑपरेटर की तरह एक समानता तुलना करता है, लेकिन NULL के बजाय 1 लौटाता है यदि दोनों ऑपरेशन्स NULL हैं, और NULL के बजाय 0 यदि कोई ऑपरेंड NULL है।

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

संपादित करें: - ( हालांकि एक महत्वपूर्ण साइड नोट का उल्लेख करने में बहुत देर हो चुकी है, जिसका उल्लेख नहीं है <=> साथ ही )

एक और बात:-

न <=>

खेतों के साथ NULL मानों की तुलना करने के लिए उपयोग किया जाने वाला एक और बिंदु नहीं है <=> । यदि सामान्य! = या <> (नहीं के बराबर है) संचालक किसी पूर्ण मान के पूर्ण होने पर NULL वापस करते हैं। लागू नहीं होने के साथ <=> ऑपरेटर सही या गलत रिटर्न देता है। <=> पर लागू नहीं है ऑपरेटर उतना ही नहीं है जितना कि पूरा नहीं है।

उदाहरण:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

1
NOT <=>ऑपरेटर नहीं है, यह के NOTपरिणाम पर लागू होता है op1 <=> op2
जेक

@ जैक: - हां आप सही हैं। उत्तर अपडेट किया गया! एक बिंदु बनाने के लिए इतना जोड़ा गया :)
राहुल त्रिपाठी

इसलिए मुझे लगता है कि कोई <!=>ऑपरेटर नहीं है
किप

@kip: नहीं वहाँ नहीं है!
राहुल त्रिपाठी

18

<=>MySQL की अशक्त "ऑपरेटर के बराबर" सुरक्षित है। मैनुअल से :

पूर्ण-सुरक्षित बराबर। यह ऑपरेटर = ऑपरेटर की तरह एक समानता तुलना करता है, लेकिन NULL के बजाय 1 लौटाता है यदि दोनों ऑपरेशन्स NULL हैं, और NULL के बजाय 0 यदि कोई ऑपरेंड NULL है।

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

11

पूर्ण-सुरक्षित बराबर। यह ऑपरेटर = ऑपरेटर की तरह एक समानता तुलना करता है, लेकिन NULL के बजाय 1 लौटाता है यदि दोनों ऑपरेशन्स NULL हैं, और NULL के बजाय 0 यदि कोई ऑपरेंड NULL है।

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

यह महत्व:

जब आप एक NULL मान की गैर-पूर्ण मान से तुलना करते हैं, तो आपको NULL मिलेगा। यदि आप चेक करना चाहते हैं कि क्या मान शून्य है।

इक्विटी ऑपरेटर (<=>) जो NULL को एक सामान्य मान मानता है, इसलिए यह 1 (NULL) नहीं लौटाता है यदि दोनों मान NULL हैं और 0 (NULL नहीं) यदि मान में से एक NULL है:

जैसे

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>है शून्य-सुरक्षित बराबर ऑपरेटरa <=> bलेखन के समान है:

CASE
    WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
    WHEN a IS NULL OR  b IS NULL THEN 0 -- one operand is null then 0
    ELSE a = b                          -- else behave like normal = operator
END

और क्षमा करें, मुझे इसके बजाय इस ऑपरेटर का उपयोग करने का एक अच्छा कारण नहीं मिल सकता है AND/OR IS (NOT) NULL। उदाहरण के लिए आपका उदाहरण, WHERE p.name <=> NULLजैसा है WHERE p.name IS NULL


9

से MySQL प्रलेखन :

पूर्ण-सुरक्षित बराबर। यह ऑपरेटर = ऑपरेटर की तरह एक समानता तुलना करता है, लेकिन NULL के बजाय 1 लौटाता है यदि दोनों ऑपरेशन्स NULL हैं, और NULL के बजाय 0 यदि कोई ऑपरेंड NULL है।

<=>ऑपरेटर का उपयोग करने वाला एक उदाहरण होगा:

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

जो लौटेगा:

1, 1, 0

नियमित =ऑपरेटर का एक उदाहरण होगा:

SELECT 1 = 1, NULL = NULL, 1 = NULL;

जो लौटेगा:

1, NULL, NULL

<=>ऑपरेटर बहुत के समान है =, ऑपरेटर को छोड़कर <=>वापस कभी नहीं होगाNULL



1
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
+----+------+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  3 | NULL |  3 | NULL |
|  4 | NULL |  3 | NULL |
|  3 | NULL |  4 | NULL |
|  4 | NULL |  4 | NULL |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.