2013-08-14 5 views
13

यहाँ Postgresql 9.2.4 पर सेटअप है:PostgreSQL नहीं iLike खंड अशक्त स्ट्रिंग शामिल नहीं है महत्व देता

CREATE TABLE table (
    id integer NOT NULL, 
    some_text text 
); 

अब हम, some_text के लिए एक शून्य या खाली स्ट्रिंग के साथ एक रिकॉर्ड दर्ज है, ताकि जब हम क्वेरी:

SELECT * FROM table WHERE some_text IS NULL; 

मुझे प्रवेश वापस मिल गया। अब तक सब ठीक है।

हालांकि

, जब मैं क्वेरी:

SELECT * FROM table WHERE some_text NOT ILIKE "%anything%'; 

मुझे लगता है कि कुछ भी नहीं लौटाया गया। ऐसा क्यों है? मैं उम्मीद करता हूं कि एक शून्य या खाली स्ट्रिंग "anything की तरह नहीं है"।

उत्तर

31

एसक्यूएल में, न्यूल कुछ भी बराबर नहीं है। न ही यह किसी भी चीज़ के लिए असमान है।

दूसरे शब्दों में, यदि मैं आपको अपना मध्य नाम नहीं बताता, और आप मुझे अपना मध्य नाम नहीं बताते हैं, तो हम कैसे जान सकते हैं कि हमारे दो मध्य नाम एक ही नाम या अलग-अलग नाम हैं? हम नहीं जान सकते

यह अक्सर एसक्यूएल में लोगों को भ्रमण करता है, क्योंकि यह "त्रि-मूल्य तर्क" है। एक अभिव्यक्ति सत्य, गलत, या अज्ञात हो सकती है। हम में से जो लोग बूलियन बीजगणित से परिचित हैं, उन्हें पता है कि सत्य गलत नहीं है, और गलत नहीं है।

लेकिन मुश्किल हिस्सा यह है कि अज्ञात अभी भी अनजान नहीं है।

तो आप के लिए समाधान है या तो हमेशा अपने कॉलम में एक गैर-शून्य स्ट्रिंग की दुकान, वरना त्रिकोणीय मूल्य तर्क के लिए खाते की एक अभिव्यक्ति का उपयोग करें:

SELECT * FROM table WHERE some_text NOT ILIKE "%anything%' OR some_text IS NULL; 

या:

SELECT * FROM table WHERE COALESCE(some_text, '') NOT ILIKE '%anything%'; 

SELECT * FROM table WHERE some_text IS DISTINCT FROM 'anything'; 

लेकिन दुर्भाग्य से, यह:

PostgreSQL भी एक null-safe equality operator का समर्थन करता है केवल समानता के लिए काम करता है, न कि पैटर्न और वाइल्डकार्ड के साथ LIKE/ILIKE के लिए।

+1

की तरह, अपने लक्ष्य को प्राप्त करने COALESCE उपयोग कर सकते हैं मुझे पसंद है आप * अज्ञात * के साथ स्पष्टीकरण हो, लेकिन मुझे यकीन है कि कैसे एसक्यूएल जोड़ता है नहीं कर रहा हूँ। एक 'जहां शून्य शून्य'% कुछ भी% 'अज्ञात क्यों है? – applepie

+1

"युवा व्यक्ति, गणित में आप चीजों को समझ नहीं पाते हैं। आप बस उनके लिए उपयोग करते हैं।" - जॉन वॉन न्यूमैन –

+2

ओस सास। क्या यह एक कठिन अनुवर्ती सवाल है? – applepie

3

आप

SELECT * FROM table WHERE COALESCE(some_text,'') NOT ILIKE "%anything%'; 
संबंधित मुद्दे