क्या कोई एसक्यूएल में निम्नलिखित व्यवहार की व्याख्या कर सकता है?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
क्या कोई एसक्यूएल में निम्नलिखित व्यवहार की व्याख्या कर सकता है?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
जवाबों:
<>
मानक SQL-92 है; !=
इसके बराबर है। दोनों मूल्यों के लिए मूल्यांकन करते हैं, जो NULL
नहीं है - NULL
यह कहने के लिए एक प्लेसहोल्डर है कि मूल्य का अभाव है।
यही कारण है कि आप ऐसी स्थितियों के लिए केवल IS NULL
/ के IS NOT NULL
रूप में उपयोग कर सकते हैं ।
यह व्यवहार SQL सर्वर के लिए विशिष्ट नहीं है। सभी मानकों के अनुरूप SQL बोलियाँ उसी तरह काम करती हैं।
नोट : तुलना करने के लिए यदि आपका मान शून्य नहीं है , तो आप उपयोग IS NOT NULL
करते हैं , जबकि शून्य मान की तुलना करने के लिए , आप उपयोग करते हैं <> 'YOUR_VALUE'
। मैं यह नहीं कह सकता कि मेरा मूल्य NULL के बराबर है या नहीं, लेकिन मैं कह सकता हूं कि क्या मेरा मूल्य NULL या NOT NULL है। मैं तुलना कर सकता हूं कि क्या मेरा मूल्य NULL के अलावा कुछ है।
!=
~ 9i तक समर्थन नहीं किया , जैसा कि मैं समझता हूं, जो बहुत सारे एएनएसआई -92 सिंटैक्स में लाया गया है। मेरा विश्वास MySQL के समान है, 4.x में समर्थन शुरू कर रहा है।
!=
एक विकल्प के रूप में बाद की कल्पना में शामिल हो सकता है <>
। नए चश्मे पर मेरे हाथ नहीं हैं इसलिए मैं निश्चित रूप से नहीं कह सकता।
WHERE MyColumn != NULL
या WHERE MyColumn = NULL
नियतात्मक का परिणाम है ? या दूसरे शब्दों में, क्या यह हमेशा 0 पंक्तियों को वापस करने की गारंटी है, कोई फर्क नहीं पड़ता MyColumn
कि डेटाबेस में अशक्त है या नहीं?
!=
केवल मूल्यों के लिए मूल्यांकन किया जाता है, ऐसा कुछ WHERE MyColumn != 'somevalue'
करना NULL रिकॉर्ड वापस नहीं करेगा।
NULL का कोई मूल्य नहीं है, और इसलिए स्केलर मान ऑपरेटरों का उपयोग करके तुलना नहीं की जा सकती है।
दूसरे शब्दों में, कोई भी मूल्य NULL के बराबर (या बराबर नहीं) हो सकता है क्योंकि NULL का कोई मूल्य नहीं है।
इसलिए, SQL के पास NULL से निपटने के लिए विशेष IS NULL और IS NULL नहीं है।
'a' != null
कोई मान नहीं है ( true
/ 1
) काउंटर सहज है और समय-समय पर मुझे पकड़ता है! मैंने सोचा होगा "कोई मूल्य नहीं की तुलना में कुछ मूल्य" हमेशा "बराबर नहीं" होगा, लेकिन शायद यह सिर्फ मेरे लिए है?
SELECT * FROM MyTable WHERE coalesce(MyColumn, 'x') <> 'x'
यदि आप NULL मान हैं, तो आप आमतौर पर एक स्थिरांक असाइन कर सकते हैं , बशर्ते कि आप सेंटिनल वैल्यू x (इस स्थिति में एक स्ट्रिंग / चार) के लिए एक उपयुक्त डेटाटाइप दें। यह TSQL सिंटैक्स है लेकिन ओरेकल और अन्य इंजनों में समान विशेषताएं हैं।
ध्यान दें कि यह व्यवहार डिफ़ॉल्ट (ANSI) व्यवहार है।
अगर तुम:
SET ANSI_NULLS OFF
http://msdn.microsoft.com/en-us/library/ms188048.aspx
आपको अलग परिणाम मिलेंगे।
SET ANSI_NULLS OFF
जाहिर है भविष्य में दूर जा रहा होगा ...
create unique index UK_MyTable on MyTable (Column) where Column is not null
) में WHERE क्लॉज जोड़कर SQL सर्वर इंडेक्स में डुप्लिकेट NULLs प्राप्त कर सकते हैं (जैसे ): msdn.microsoft.com/en-us/library/cc280372.aspx
SET ANSI_NULLS
ऑफ है, तो बराबर (=) और न के बराबर (<>) तुलना ऑपरेटर आईएसओ मानक का पालन नहीं करते हैं। एक सेलेक्ट स्टेटमेंट जिसमें WHERE column_name = NULL
उन पंक्तियों का उपयोग किया जाता है जो कॉलम_नाम में अशक्त मान रखते हैं। एक WHERE column_name <> NULL
सेलेक्ट स्टेटमेंट जो उन पंक्तियों का उपयोग करता है जो कॉलम में नॉनबल मान रखते हैं। इसके अलावा, एक चयन कथन जो WHERE column_name <> XYZ_value
उन सभी पंक्तियों का उपयोग करता है जो XYZ_value नहीं हैं और जो NULL नहीं हैं। IMHO, यह अंतिम कथन परिणामों से शून्य के बहिष्कार में थोड़ा अजीब लगता है!
SQL में, कुछ भी आप NULL
UNKNOWN में परिणामों के साथ मूल्यांकन / गणना करते हैं
यही कारण है कि SELECT * FROM MyTable WHERE MyColumn != NULL
या SELECT * FROM MyTable WHERE MyColumn <> NULL
आप 0 परिणाम देता है।
NULL
मानों के लिए एक चेक प्रदान करने के लिए , isNull फ़ंक्शन प्रदान किया जाता है।
इसके अलावा, आप IS
ऑपरेटर का उपयोग कर सकते हैं जैसा कि आपने तीसरे प्रश्न में किया था।
उम्मीद है की यह मदद करेगा।
NULL का एकमात्र परीक्षण IS NULL या IS NOT NULL है। समानता के लिए परीक्षण निरर्थक है क्योंकि परिभाषा के अनुसार किसी को यह नहीं पता है कि मूल्य क्या है।
यहाँ एक विकिपीडिया लेख पढ़ने के लिए है:
हम प्रयोग करते हैं
SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';
उन सभी पंक्तियों को वापस करने के लिए जहाँ MyColumn NULL या सभी पंक्तियाँ हैं जहाँ MyColumn एक रिक्त स्ट्रिंग है। कई "अंतिम उपयोगकर्ता" के लिए, NULL बनाम खाली स्ट्रिंग समस्या आवश्यकता और भ्रम की स्थिति के बिना एक अंतर है।
मैं सिर्फ अन्य मूल्यों या अन्य नलियों के लिए तुलनीय नहीं होने के लिए कार्यात्मक और सहज कारण नहीं देखता, क्योंकि हम स्पष्ट रूप से इसकी तुलना कर सकते हैं और कह सकते हैं कि वे हमारे संदर्भ में समान हैं या नहीं। ये मजाकिया है। बस कुछ तार्किक निष्कर्षों और स्थिरता के कारण हमें इसके साथ लगातार परेशान होने की आवश्यकता है। यह कार्यात्मक नहीं है, इसे और अधिक कार्यात्मक बनाएं और यह निष्कर्ष निकालने के लिए दार्शनिकों और वैज्ञानिकों पर छोड़ दें कि क्या यह सुसंगत है या नहीं और यह "सार्वभौमिक तर्क" रखता है। :) कोई यह कह सकता है कि यह अनुक्रमणिका या किसी और चीज़ के कारण है, मुझे संदेह है कि उन चीजों को मानों के समान नल का समर्थन करने के लिए नहीं बनाया जा सकता है। यह दो खाली ग्लासों की तुलना करने के समान है, एक बेल ग्लास है और दूसरा बीयर ग्लास है, हम वस्तुओं के प्रकारों की तुलना नहीं कर रहे हैं, लेकिन उनमें जो मूल्य हैं, उसी तरह आप इंट और वर्चर की तुलना कर सकते हैं, इसे शून्य के साथ ' और भी आसान है, यह कुछ भी नहीं है और जो कुछ भी सामान्यता में दो समानताएं हैं, वे समान हैं, स्पष्ट रूप से मेरे द्वारा और बाकी सभी द्वारा जो कि sql लिखते हैं, क्योंकि हम लगातार कुछ ANSI मानकों के कारण अजीब तरीकों से तुलना करके उस तर्क को तोड़ रहे हैं। हमारे लिए इसे करने के लिए कंप्यूटर शक्ति का उपयोग क्यों नहीं किया गया है और मुझे संदेह है कि अगर यह सब कुछ उसी के साथ निर्मित होता है तो यह चीजों को धीमा कर देगा। "यह शून्य नहीं है, यह कुछ भी नहीं है", यह ऐप्पल नहीं है यह एपफेल है, चलो ... कार्यात्मक रूप से आपका दोस्त है और यहां तर्क भी है। अंत में केवल एक चीज जो कि कार्यक्षमता है और इस तरह से नल का उपयोग करने से अधिक या कम कार्यक्षमता और उपयोग में आसानी होती है। क्या यह अधिक उपयोगी है? क्योंकि हम लगातार कुछ ANSI मानकों के कारण अजीब तरीके से तुलना करके उस तर्क को तोड़ रहे हैं। हमारे लिए इसे करने के लिए कंप्यूटर शक्ति का उपयोग क्यों नहीं किया गया है और मुझे संदेह है कि अगर यह सब कुछ उसी के साथ निर्मित होता है तो यह चीजों को धीमा कर देगा। "यह शून्य नहीं है, यह कुछ भी नहीं है", यह ऐप्पल नहीं है यह एपफेल है, चलो ... कार्यात्मक रूप से आपका दोस्त है और यहां तर्क भी है। अंत में केवल एक चीज जो कि कार्यक्षमता है और इस तरह से नल का उपयोग करने से अधिक या कम कार्यक्षमता और उपयोग में आसानी होती है। क्या यह अधिक उपयोगी है? क्योंकि हम लगातार कुछ ANSI मानकों के कारण अजीब तरीके से तुलना करके उस तर्क को तोड़ रहे हैं। हमारे लिए इसे करने के लिए कंप्यूटर शक्ति का उपयोग क्यों नहीं किया गया है और मुझे संदेह है कि अगर यह सब कुछ उसी के साथ निर्मित होता है तो यह चीजों को धीमा कर देगा। "यह शून्य नहीं है, यह कुछ भी नहीं है", यह ऐप्पल नहीं है यह एपफेल है, चलो ... कार्यात्मक रूप से आपका दोस्त है और यहां तर्क भी है। अंत में केवल एक चीज जो कि कार्यक्षमता है और इस तरह से नल का उपयोग करने से अधिक या कम कार्यक्षमता और उपयोग में आसानी होती है। क्या यह अधिक उपयोगी है? सेब नहीं है यह एपफेल है, चलो ... कार्यात्मक रूप से तुम्हारा दोस्त है और यहां तर्क भी है। अंत में केवल एक चीज जो कि कार्यक्षमता है और इस तरह से नल का उपयोग करने से अधिक या कम कार्यक्षमता और उपयोग में आसानी होती है। क्या यह अधिक उपयोगी है? सेब नहीं है यह एपफेल है, चलो ... कार्यात्मक रूप से तुम्हारा दोस्त है और यहां तर्क भी है। अंत में केवल एक चीज जो कि कार्यक्षमता है और इस तरह से नल का उपयोग करने से अधिक या कम कार्यक्षमता और उपयोग में आसानी होती है। क्या यह अधिक उपयोगी है?
इस कोड पर विचार करें:
SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end
आपमें से कितने लोग जानते हैं कि यह कोड क्या लौटाएगा? के साथ या बिना यह वापस नहीं आता है 0. मेरे लिए यह कार्यात्मक नहीं है और यह भ्रामक है। सी # में यह सब जैसा है वैसा होना चाहिए, तुलनात्मक संचालन का मूल्य वापस आता है, तार्किक रूप से यह भी मूल्य पैदा करता है, क्योंकि अगर यह तुलना करने के लिए कुछ भी नहीं है (इसके अलावा कुछ भी नहीं है :))। वे सिर्फ "कहा": शून्य "रिटर्न" की तुलना में कुछ भी 0 और जो कई वर्कअराउंड और सिरदर्द पैदा करता है।
यह वह कोड है जो मुझे यहां लाया गया है:
where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)
मुझे बस तुलना करने की ज़रूरत है कि दो फ़ील्ड (जिसमें) के अलग-अलग मूल्य हैं, मैं फ़ंक्शन का उपयोग कर सकता हूं, लेकिन ...
तुलना ऑपरेटरों का उपयोग करके किसी भी मूल्य की तुलना नहीं की जा सकती। NULL = NULL गलत है। अशक्त मूल्य नहीं है। IS ऑपरेटर को विशेष रूप से NULL तुलनाओं को संभालने के लिए डिज़ाइन किया गया है।
null = null
जहां कोई 1=0
कुछ तदर्थ क्वेरी में उपयोग कर सकता है । और अगर वे शिकायत करते हैं, तो मैं इसे बदल देता हूं null != null
:)
पुराना प्रश्न है, लेकिन निम्नलिखित कुछ और विवरण दे सकता है।
null
कोई मूल्य या अज्ञात मूल्य का प्रतिनिधित्व नहीं करता है। यह निर्दिष्ट नहीं करता है कि कोई मूल्य क्यों नहीं है, जिससे कुछ अस्पष्टता हो सकती है।
मान लीजिए कि आप इस तरह एक क्वेरी चलाते हैं:
SELECT *
FROM orders
WHERE delivered=ordered;
अर्थात्, आप उन पंक्तियों की तलाश कर रहे हैं जहाँ तारीखें ordered
और delivered
तारीखें समान हों।
एक या दोनों स्तंभों के अशक्त होने पर क्या अपेक्षित है?
क्योंकि कम से कम एक तारीख अज्ञात है, आप यह कहने की उम्मीद नहीं कर सकते कि 2 तारीखें समान हैं। यह भी मामला है जब दोनों तिथियां अज्ञात हैं: यदि वे यह भी नहीं जानते कि वे क्या हैं तो वे कैसे हो सकते हैं?
इस कारण से, null
मान के रूप में व्यवहार करने वाली कोई भी अभिव्यक्ति विफल होनी चाहिए। इस मामले में, यह मेल नहीं खाएगा। यदि आप निम्न प्रयास करते हैं तो यह भी मामला है:
SELECT *
FROM orders
WHERE delivered<>ordered;
फिर, हम कैसे कह सकते हैं कि दो मूल्य समान नहीं हैं यदि हम नहीं जानते कि वे क्या हैं।
SQL में लापता मानों के लिए एक विशिष्ट परीक्षण है:
IS NULL
विशेष रूप से यह मूल्यों की तुलना नहीं कर रहा है , बल्कि यह लापता मूल्यों की तलाश करता है ।
अंत में, !=
ऑपरेटर के संबंध में , जहां तक मुझे जानकारी है, यह वास्तव में किसी भी मानक में नहीं है, लेकिन यह बहुत व्यापक रूप से समर्थित है। इसे कुछ भाषाओं के प्रोग्रामर को घर पर अधिक महसूस कराने के लिए जोड़ा गया था। सच कहूँ तो, अगर किसी प्रोग्रामर को यह याद रखने में कठिनाई होती है कि वे किस भाषा का उपयोग कर रहे हैं, तो वे खराब शुरुआत से दूर हैं।
NULL
तो इसका मतलब है कि हम एक मूल्य की तुलना ' NULL
मूल्य' से कर रहे हैं, न कि "अनिर्धारित मूल्य जो कि अंडरलेइंग NULL
है, उसका मूल्य है ? लेकिन क्या हम नहीं जानते?" ", जो स्पष्ट रूप से हम कभी नहीं जान पाएंगे। यह वास्तव में चीजों को कम करेगा।
IS NULL
की तुलना में बहुत अधिक कठिन है = NULL
। मुझे लगता है कि यह एक विशेष मामले के रूप में बाद में इलाज करने के बजाय, यदि WHERE columnA = columnB
एक ही व्याख्या है WHERE columnA = NULL
, तो यह अधिक सुसंगत होगा । याद रखें कि NULL
है नहीं एक मूल्य। भाषाओं जहां यह प्रोग्रामिंग में है परीक्षण करने के लिए वैध variable == null
है क्योंकि null
एक अलग अर्थ है; यह कुछ अज्ञात का प्रतिनिधित्व नहीं करता है, लेकिन एक मूल्य के जानबूझकर रीसेट करना। SQL के साथ ऐसा नहीं है।
IS NULL
AND के बीच कोई ओवरहेड नहीं है =NULL
। लेकिन होवर के अंतिम एक पर एक नज़र डालें। मैं इसे बार-बार अनुभव करके थक गया हूं, ¿अनावश्यक भार उठाने के लिए? अतिरिक्त जाँच ...
मैं इस कोड का सुझाव देना चाहता हूं जो मैंने पाया है कि क्या एक मूल्य में बदलाव है,
i
नया मूल्य है और d
पुराना होने के नाते (हालांकि आदेश कोई फर्क नहीं पड़ता)। उस मामले के लिए, मान से अशक्त या इसके विपरीत में परिवर्तन एक परिवर्तन है, लेकिन अशक्त से अशक्त नहीं है (निश्चित रूप से, मूल्य से दूसरे मूल्य में परिवर्तन है, लेकिन मूल्य से उसी के लिए नहीं है)।
CREATE FUNCTION [dbo].[ufn_equal_with_nulls]
(
@i sql_variant,
@d sql_variant
)
RETURNS bit
AS
BEGIN
DECLARE @in bit = 0, @dn bit = 0
if @i is null set @in = 1
if @d is null set @dn = 1
if @in <> @dn
return 0
if @in = 1 and @dn = 1
return 1
if @in = 0 and @dn = 0 and @i = @d
return 1
return 0
END
इस फ़ंक्शन का उपयोग करने के लिए, आप कर सकते हैं
declare @tmp table (a int, b int)
insert into @tmp values
(1,1),
(1,2),
(1,null),
(null,1),
(null,null)
---- in select ----
select *, [dbo].[ufn_equal_with_nulls](a,b) as [=] from @tmp
---- where equal ----
select *,'equal' as [Predicate] from @tmp where [dbo].[ufn_equal_with_nulls](a,b) = 1
---- where not equal ----
select *,'not equal' as [Predicate] from @tmp where [dbo].[ufn_equal_with_nulls](a,b) = 0
परिणाम हैं:
---- in select ----
a b =
1 1 1
1 2 0
1 NULL 0
NULL 1 0
NULL NULL 1
---- where equal ----
1 1 equal
NULL NULL equal
---- where not equal ----
1 2 not equal
1 NULL not equal
NULL 1 not equal
Sql_variant का उपयोग इसे विभिन्न प्रकारों के लिए अनुकूल बनाता है
NULL कुछ भी नहीं है ... यह अज्ञात है। NULL कुछ भी बराबर नहीं करता है। इसीलिए आपको अपने SQL प्रश्नों में = NULL के बजाय मैजिक वाक्यांश IS NULL का उपयोग करना होगा
आप इसका उल्लेख कर सकते हैं: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx
<>
कि यह 92 की युक्ति में है, लेकिन अधिकांश विक्रेता इसका समर्थन करते हैं!=
और / या यह बाद की कल्पना में 99 या 03 की तरह शामिल है।