किसी भी शब्दों की सूची के लिए PostgreSQL वाइल्डकार्ड पसंद करें


156

मेरे पास ~ 25 शब्दों की एक सरल सूची है। मेरे पास PostgreSQL में एक varchar फ़ील्ड है, मान लीजिए कि सूची है ['foo', 'bar', 'baz']। मैं अपनी तालिका में कोई भी पंक्ति ढूंढना चाहता हूं जिसमें कोई भी शब्द हो। यह काम करेगा, लेकिन मैं और अधिक सुरुचिपूर्ण कुछ चाहूंगा।

select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')

जवाबों:


166

आप Postgres ' SIMILAR TOऑपरेटर का उपयोग कर सकते हैं जो विकल्प का समर्थन करता है, अर्थात

select * from table where lower(value) similar to '%(foo|bar|baz)%';

1
रेगेक्स इसे थोड़ा तेज कर सकता है: dba.stackexchange.com/questions/10694/…
लगभग

तुम्हे कैसे पता ? अधिकांश दस्तावेज़ मैंने पढ़ा है कि रेगेक्स धीमा और एक%% है ...
डेस्टिनोवा

5
Dba.stackexchange.com/a/10696/27757 के अनुसार SIMILAR TOआंतरिक रूप से एक रेगेक्स खोज में अनुवाद किया गया है
मार्क के कोवान

मुझे लगता है कि प्रयोग lower()करना अप्रभावी है क्योंकि यह पहली बार प्रत्येक स्ट्रिंग को लोअरकेस में बदल देगा, जो केवल केस-असंवेदनशील मैच की तुलना में अधिक महंगा है
गिलाद मेयानी

229

PostgreSQL भी पूर्ण POSIX नियमित अभिव्यक्ति का समर्थन करता है :

select * from table where value ~* 'foo|bar|baz';

~*एक केस संवेदी मैच के लिए है,~ केस संवेदी है।

एक अन्य विकल्प किसी का उपयोग करना है :

select * from table where value  like any (array['%foo%', '%bar%', '%baz%']);
select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);

आप किसी भी ऑपरेटर के साथ बूलियन की पैदावार कर सकते हैं। मुझे संदेह है कि regex विकल्प जल्दी होगा लेकिन आपके टूलबॉक्स में कोई भी उपयोगी उपकरण है।


दिलचस्प है, जबकि ये दोनों तरीके @chmullig के समाधान (इसलिए +1) की तुलना में अधिक सुरुचिपूर्ण हैं, जब कम से कम 3 विकल्पों की जांच करते हैं, तो वे बड़ी तालिकाओं (मेरे मामले में 91.5 मिलियन रिकॉर्ड) पर काफी धीमी गति से निष्पादित करते हैं। मैं इनमें से किसी एक का उपयोग करते समय 2x के बारे में समय वृद्धि देख रहा था। किसी भी विचार क्यों हो सकता है?
ऋषि 88

@ sage88 मुझे अपने सिर के ऊपर से पता नहीं है, लेकिन इरविन ब्रांडस्टेट्टर और ट्रिग्राम इंडेक्स को जोड़ने से मदद मिल सकती है।
म्यू बहुत कम है

13

वास्तव में PostgreSQL में इसके लिए एक ऑपरेटर है:

SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');


तो क्या किसी भी तरह से सरणी के साथ इलीके का उपयोग किया जा सकता है ? फैंसी रेगेक्स की आवश्यकता न होने पर यह साफ दिखता है। या यह वैसे भी आंतरिक रूप से regex अनुवाद किया जा रहा है?
mlt

@ एमएलटी एक अच्छा सवाल है, डॉक्टर को पढ़ने से स्पष्ट उत्तर नहीं मिलता है। SIMILAR TOनियमित अभिव्यक्ति में परिवर्तित होता है, ~ऑपरेटर POSIX नियमित अभिव्यक्ति के लिए खड़ा है, लेकिन यह इसके लिए स्पष्ट नहीं है LIKE
11:18 बजे jlandercy

0

एक 'सुरुचिपूर्ण' समाधान पूर्ण पाठ खोज का उपयोग करना होगा: http://www.postgresql.org/docs/9.0/interactive/textsearch.html । तब आप पूर्ण पाठ खोज क्वेरी का उपयोग करेंगे।


1
डाउनवोट, क्योंकि यह केवल एक लिंक है जो एक टिप्पणी के रूप में बेहतर होगा।
Toraritte
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.