2012-02-01 10 views
7

को देखते हुए निम्न तालिका: सभी मामलों के लिएSQLite में = NULL कार्य कैसे करें?

 
SELECT * FROM Comedians WHERE Middle=? 

काम:

 
Table: Comedians 
================= 

Id First Middle Last 
--- ------- -------- ------- 
1  Bob  NULL  Sagat 
2 Jerry  Kal  Seinfeld  

मैं निम्नलिखित तैयार क्वेरी बनाना चाहते हैं। यह वर्तमान में उस मामले के लिए काम नहीं करता है जहां मैं sqlite3_bind_null के माध्यम से NULL पास करता हूं। मुझे एहसास है कि वास्तव में NULL मानों की खोज करने के लिए क्वेरी IS NULL का उपयोग करती है, लेकिन इसका मतलब यह होगा कि मैं सभी मामलों के लिए तैयार क्वेरी का उपयोग नहीं कर सकता। मुझे वास्तव में इनपुट के आधार पर क्वेरी को बदलना होगा, जो मुख्य रूप से तैयार क्वेरी के उद्देश्य को हरा देता है। मैं यह कैसे करु? धन्यवाद!

+0

कैसे होगा के लिए एक उपयोगकर्ता की खोज एक मध्य नाम के बिना एक हास्य अभिनेता? – Mithrandir

+0

@ मिथरंदिर यह उपयोगकर्ता का सामना करने वाला उपयोगकर्ता नहीं है, यह आंतरिक उपयोग के लिए है। अनिवार्य रूप से, मैं फ़ंक्शन में एक पॉइंटर (char *) पास करता हूं। यदि सूचक पूर्ण है तो मैं 'sqlite3_bind_null' का उपयोग करता हूं लेकिन यदि यह स्ट्रिंग' नल 'है तो मैं स्ट्रिंग फ़ंक्शन का उपयोग करता हूं। – chacham15

उत्तर

7

आप = के बजाय IS operator का उपयोग कर सकते हैं।

SELECT * FROM Comedians WHERE Middle IS ? 
+2

लानत, क्या केवल SQLite पर है? यह अन्य एसक्यूएल पर बहुत उपयोगी होगा ... – dotjoe

+0

कमाल! मुझे इसकी ही खोज थी! – chacham15

+2

@dotje: PostgreSQL में आप 'बी से बीएसआई नहीं है' का उपयोग कर सकते हैं। 'ए = बी' से थोड़ा अधिक महंगा। –

4

कुछ भी = NULL से मेल नहीं खाता है। यह जांचने का एकमात्र तरीका IS NULL के साथ है।

आप चीजों की एक किस्म कर सकते हैं, लेकिन सीधे आगे से एक है ...

WHERE 
    middle = ? 
    OR (middle IS NULL and ? IS NULL) 

अगर वहाँ एक मूल्य के आप कभी पता नहीं दिखाई देता है, आप के लिए है कि बदल सकते हैं ...

WHERE 
    COALESCE(middle, '-') = COALESCE(?, '-') 

लेकिन आपको एक ऐसे मूल्य की आवश्यकता है जो सचमुच कभी प्रकट न हो। इसके अलावा, यह इंडेक्स के उपयोग को रोकता है, लेकिन OR संस्करण अक्सर भी चूस सकता है (मुझे नहीं पता कि SQLite कितनी अच्छी तरह से इसका इलाज करता है)।

सभी चीजें बराबर हैं, मैं पहले संस्करण की अनुशंसा करता हूं।

2

NULL एक मूल्य नहीं है, लेकिन एक फ़ील्ड की विशेषता है। इसके बजाय

SELECT * FROM Comedians WHERE Middle IS NULL 
+0

यह एक सामान्य समाधान नहीं है क्योंकि यह मुझे शून्य – chacham15

+0

@ chacham15 के अलावा किसी अन्य चीज़ के साथ समानता का परीक्षण करने की अनुमति नहीं देता है: NULL का उपयोग करके कोई सामान्य समाधान नहीं है, क्योंकि यह कोई मान नहीं है। शायद आपको इसके बजाय एक [सेंटीनेल वैल्यू] (http://en.wikipedia.org/wiki/Sentinel_value) का उपयोग करना चाहिए। – wallyk

+0

स्वीकृत उत्तर देखें – chacham15

0

का उपयोग आप शून्य

SELECT * FROM Comedians WHERE Middle=IfNull(?, Middle) 

पर सब कुछ से मेल खाते हैं, तो चाहते देखें शून्य

SELECT * FROM Comedians WHERE Middle=IfNull(?, 'DUMMY'+Middle) 

पर कोई भी मेल खाते हैं इस जवाब चाहते हैं: https://stackoverflow.com/a/799406/30225

संबंधित मुद्दे