यह NULL
की एक मौलिक संपत्ति है कि जब आप यह कुछ भी — जिसके कारण है कि तुम क्या काम नहीं करता है क्या कर रहे हैं NULL
— यह रिटर्न false
सहित, के लिए की तुलना करें।
तो जवाब देने वाला पहला सवाल यह है: आप NULL
lastname
के साथ पंक्ति क्यों चाहते हैं जब वे "स्मिथ" के lastname
दर्ज करते हैं? संभवतः आपका मतलब है कि या तो पहला नाम या अंतिम नाम लौटने के लिए मिलान करने की आवश्यकता है, इस स्थिति में आप सही क्वेरी नहीं चला रहे हैं। सबसे अनुभवहीन समाधान है:
SELECT firstname, lastname, ....
FROM profiles
WHERE IFNULL(firstName LIKE'%{firstname}%'
OR lastName LIKE '%{lastName}%'
अब इस सैकड़ों और कई हजार संभवतः पंक्तियों के लिए काम करेंगे, लेकिन कई कारणों से परे स्केल नहीं करेगा:
OR
रों के मामले में आम तौर पर कर रहे हैं खस्ताहाल प्रदर्शन। जहां संभव हो उनसे बचें। यदि आप अनुभवी प्रोग्रामर द्वारा लिखे गए डेटाबेस अनुप्रयोगों को देखते हैं तो आपको शायद एक OR
स्थिति नहीं मिलेगी (उन लोगों को छोड़कर जो OR
के गुणों को संभावित रूप से अतिथि पुस्तिका में लिखे गए हैं, जिसमें 3 उपयोगकर्ता और 2 महीने में हिट होते हैं) ;
LIKE
को %
के साथ फ्रंट पर मतलब होगा कि कोई अनुक्रमणिका पर मुकदमा नहीं किया जाएगा।
(2) के कई समाधान हैं। शायद MySQL में सबसे आसान है MyISAM तालिकाओं पर full text searching का उपयोग करना है। यदि आप "हन" टाइप करते हैं तो यह "जोहान्स" जैसे मैचों को नहीं मिलेगा लेकिन यह आमतौर पर पर्याप्त है।
अक्सर आप UNION
या (अधिमानतः) UNION ALL
का उपयोग करके कई प्रश्नों पर OR
स्थितियों से निपटते हैं। उदाहरण के लिए:
SELECT firstname, lastname, ....
FROM profiles
WHERE firstName LIKE'%{firstname}%'
AND lastName LIKE '%{lastName}%'
UNION ALL
SELECT firstname, lastname, ....
FROM profiles
WHERE firstName LIKE'%{firstname}%'
AND lastname IS NULL
UNION ALL
SELECT firstname, lastname, ....
FROM profiles
WHERE firstName IS NULL
AND lastName LIKE '%{lastName}%'
UNION ALL
SELECT firstname, lastname, ....
FROM profiles
WHERE firstName IS NULL
AND lastName IS NULL
बड़ा और बदसूरत लेकिन UNION ALL
तराजू बहुत अच्छी तरह से (LIKE
मापदंड के शुरू में %
अनदेखी) लग रहा है। यह मूल रूप से सम्मिलित है (इस मामले में) चार प्रश्न। UNION
परिणाम पंक्तियों पर एक अंतर्निहित DISTINCT
करेगा लेकिन हम जानते हैं कि यहां कोई ओवरलैप नहीं होगा क्योंकि हम NULL
के लिए अलग-अलग जांच कर रहे हैं।
एक और संभावना NULL
का इलाज करने के लिए कुछ नहीं है जिसे आप खोजना चाहते हैं। यह एक बहुत बेहतर और अधिक सहज समाधान (imho) है। अगर कोई "स्मिथ" के अंतिम नाम में टाइप करता है, तो क्या आप वास्तव में NULL
अंतिम नाम दिखाते हुए पंक्तियां चाहते हैं?
या क्या आप उन्हें दिखाना चाहते हैं क्योंकि आपको पहले नाम पर एक मैच मिल सकता है? यदि ऐसा है, तो आप थोड़ा अलग सवाल चाहते हैं। उदाहरण के लिए:
SELECT firstname, lastname, ....
FROM profiles
WHERE id IN (
SELECT id
FROM profiles
WHERE firstName LIKE'%{firstname}%'
UNION ALL
SELECT id
FROM profiles
WHERE lastName LIKE '%{lastName}%'
)
क्या आपने LINQ-to-SQL का उपयोग करने पर विचार किया है? –
नहीं, मैंने अभी तक linq को sql नहीं माना है ... –