2010-02-11 21 views
16

इतने पर मेरा पहला सवाल अरे तरह का मेल कई! Anywho ...एसक्यूएल - प्रश्नों

फिर भी अपेक्षाकृत एसक्यूएल में एक newb तो मुझे लगता है मैं यहाँ कुछ कमी हो सकती है। मेरा सवाल है कि वर्तमान में मेरे पास फोन नंबर से भरा टेबल है। मैं एक प्रश्न पूछना चाहता हूं जहां मैं फ़ोन नंबरों की खोज करता हूं जो मेरे पास एक सूची के समान हैं। उदाहरण के लिए, मैं फोन नंबर है कि '555,123', '555,321', और '555,987' से आरंभ लगाना चाहते हैं। मैं सामान्य रूप से बताएं कि क्या आप संख्या की एक सूची है तो आप सिर्फ इस तरह के

SELECT * 
    FROM phonenumbers 
WHERE number in ('5551234567', '5559876543', ....); 

वहाँ यह करने के लिए की तरह एक रास्ता है के रूप में एक प्रश्न कर सकता है?

SELECT * 
    FROM phonenumbers 
WHERE number in like ('555123%', '555321%', '555987%'); //I know this doesn't actually work 

इसके बजाय यह व्यक्तिगत रूप से

SELECT * 
    FROM phonenumbers 
WHERE number like '555123%' 
    or number like '555321%' 
    or number like '555987%'; //Which does work but takes a long time 

क्या करना है या नहीं है के रूप में इस तरह के एक आसान है कि मैं सिर्फ याद कर रहा हूँ यह करने के लिए? मैं postgres उपयोग कर रहा हूँ, अगर कोई आदेशों यह है कि उस के साथ बाहर में मदद मिलेगी है है मैं नहीं जानता। धन्यवाद!

+1

में आपका स्वागत है अतः करने के लिए उपयोग कर सकते हैं! मैं अपने प्रश्न यह Postgres के किन संस्करणों postgres – AdaTheDev

+0

से संबंधित है स्पष्ट करने के लिए retagged है? Regexes के लिए नौकरी की तरह लगता है: http://www.postgresql.org/docs/8.3/static/functions-matching.html –

+0

'जो काम करता है लेकिन लंबे समय तक लेता है' - जब तक कि आप क्वेरी की प्रकृति को बदल नहीं देते, एक एक ही चीज़ के विभिन्न वाक्य रचनात्मक प्रतिनिधित्व लंबे समय तक ले जाएगा। कॉलम अनुक्रमित है? – MattH

उत्तर

25

आप SIMILAR TO का उपयोग करें और अलग साथ टैग कर सकते हैं | पाइप '555123%|555321%|555987%'

जैसे:

SELECT * 
FROM phonenumbers 
WHERE number SIMILAR TO '555123%|555321%|555987%' 
+1

यह वही था जो मैं खोज रहा था, धन्यवाद! मुझे जो चाहिए वह काम करता है। –

1

हो सकता है कि अगर आपके उपसर्गों सभी एक ही लंबाई हैं तो आप where RIGHT(number) in ('123456', '234456', 'etc', 'etc')

2

कर सकते हैं मुझे ऐसा नहीं लगता है, लेकिन आप

एक मेज criteria मूल्यों आप पर से मेल करना चाहते हैं पर phonenumbers शामिल हो सकते हैं, यानी
JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers 

... शायद स्थिति की एक छोटी संख्या के लिए यह नहीं लायक है, हालांकि

+0

असल में मैं खोज करने के लिए बहुत कुछ है लेकिन सोचा कि मुझे इसे कुछ ही संख्याओं के साथ सरल रखना चाहिए। –

3

अपने सभी नंबरों को मानते हुए पत्र शामिल नहीं है:

SELECT number 
FROM (
     VALUES 
     ('555123'), 
     ('555321'), 
     ('555000') 
     ) prefixes (prefix) 
JOIN phonenumbers 
ON  number >= prefix 
     AND number < prefix || 'a' 

यह यदि कोई हो, phonenumbers पर एक सूचकांक का उपयोग करेगा।

+0

मैंने आपके उपयोगकर्ता से बहुत अच्छी प्रश्न देखी हैं, आपने सामान कहाँ सीखा? क्या ऐसी कोई किताब है जो इन सभी को कवर करती है? – Pentium10

+0

@ पेंटियम 10: मैं अपने जीवन को '12' वर्षों से बाहर कर रहा हूं। मैंने कभी डेटाबेस इंटरनल (अभी तक) पर एक अच्छी किताब नहीं देखी है, लगभग सभी मैंने खुद को समझ लिया है। – Quassnoi

+0

क्या आपके पास इनके बारे में कोई पुस्तक लिखने के लिए कोई ब्लॉग या इरादा है? मैं खरीदारों के बीच होगा। – Pentium10

0

आप POSIX नियमित अभिव्यक्तियों पर भी भरोसा कर सकते हैं, official documentation की धारा 9.7.3 देखें।

उदाहरण के लिए:

SELECT * FROM foobar WHERE name ~ '12345|34567'; 

यह ध्यान रखें कि आपके name क्षेत्र एक स्ट्रिंग प्रकार का है महत्वपूर्ण है।

13

पार्टी के लिए देर हो चुकी है, लेकिन समृद्धि के लिए ... तुम भी एक ANY(array expression)

SELECT * 
FROM phonenumbers 
WHERE number LIKE ANY(ARRAY['555123%', '555321%', '555987%']) 
संबंधित मुद्दे