2009-01-13 13 views
6

अगर मैं मदों की एक सूची है,यह जांचने का सबसे अच्छा तरीका है कि आइटम्स की एक सूची SQL डेटाबेस कॉलम में मौजूद है?

apples 
pairs 
pomegranites 

कहना और मैं किसी भी है कि एक SQL DB तालिका में 'फल' कॉलम में मौजूद नहीं है की पहचान करना चाहते हैं।

  • तेज प्रदर्शन मुख्य चिंता है।
  • विभिन्न SQL कार्यान्वयन पर पोर्टेबल होने की आवश्यकता है।
  • इनपुट सूची में प्रविष्टियों की मनमानी संख्या हो सकती है।

मैं इसे करने के कुछ तरीकों के बारे में सोच सकता हूं, सोचा था कि मैं इसे वहां फेंक दूंगा और देख सकता हूं कि आप क्या सोचते हैं।

+0

ओह, और मुझे कोई परवाह नहीं है कि आइटम में आइटम किस क्रम में हैं, यह सिर्फ यह है कि प्रत्येक आइटम मौजूद है या नहीं। – Brabster

उत्तर

12

के बाद से फल आप से चयन कर रहे हैं की सूची मनमाने ढंग से लंबी हो सकती है, मैं निम्नलिखित सुझाव है:

create table FruitList (FruitName char(30)) 
insert into FruitList values ('apples'), ('pears'), ('oranges') 

select * from FruitList left outer join AllFruits on AllFruits.fruit = FruitList.FruitName 
where AllFruits.fruit is null 

एक बाहरी छोड़ दिया में शामिल होने के "नहीं" या प्रश्नों के अन्य प्रकार की तुलना में बहुत तेजी से होना चाहिए।

+0

+1 लेकिन एफडब्ल्यूआईडब्ल्यू आपको प्रत्येक ट्यूपल को अलग से संश्लेषित करने की आवश्यकता है: VALUES ('सेब'), ('नाशपाती'), (' संतरे '), ... –

+0

धन्यवाद @ बिल। मैं VALUES का अधिक उपयोग नहीं करता, पहले मेरे संदर्भ की जांच करनी चाहिए थी। फिक्स्ड। – Kluge

+0

शायद सबसे अच्छा विकल्प। यदि आप कोई टेबल नहीं बनाना चाहते हैं, तो आप एक ही चीज करने के बजाय टेबल वैरिएबल बना सकते हैं और आपकी क्वेरी समाप्त होने पर इसे नष्ट कर दिया जाएगा। – scottm

1
if exists(select top 1 name from fruit where name in ('apples', 'pairs', 'pomegranates')) 
    PRINT 'one exists' 
+0

यह केवल एक फल मौजूद है, फल की सूची नहीं है जो मौजूद नहीं है। –

+0

मुझे नहीं पता कि वह कहां कहता है कि उसे टेबल में शेष फलों की जरूरत है, चाहे यह एक मौजूद है या नहीं। – scottm

+0

क्षमा करें, मुझे अपनी सूची में मौजूद फलों की पहचान करने की आवश्यकता है लेकिन तालिका में मौजूद नहीं है। अभिनव जोएल स्पॉस्की समाधान के लिए – Brabster

3

खोज सूची को एक स्ट्रिंग में बनाएं जो '| fruit1 | fruit2 | ... fruitn |' जैसा दिखता है। और अपने जहां खंड बनाने:

where 
    @FruitListString not like '%|' + fruit + '|%' 

या, एक अस्थायी तालिका या तालिका चर में ऊपर उल्लिखित स्ट्रिंग पार्स और where not in (select fruit from temptable) है। जिन वस्तुओं को आप खोज रहे हैं और खोज की जा रही वस्तुओं की संख्या के आधार पर, यह विधि तेज हो सकती है।

+0

+1! http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause#337817 –