পোস্টগ্র্রেএসকিউএল ওয়াইল্ডকার্ড শব্দের তালিকার যে কোনও একটির জন্য পছন্দ করুন


156

আমার 25 ডলার শব্দের একটি সহজ তালিকা রয়েছে। পোস্টগ্র্রেএসকিউএল-এ আমার একটি বার্চারের ক্ষেত্র রয়েছে, আসুন সেই তালিকাটি বলি ['foo', 'bar', 'baz']। আমি আমার টেবিলে এমন কোনও সারি সন্ধান করতে চাই যাতে এর মধ্যে কোনও শব্দ থাকে। এটি কাজ করবে তবে আমি আরও মার্জিত কিছু চাই।

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

উত্তর:


165

আপনি পোস্টগ্রিস SIMILAR TOঅপারেটর ব্যবহার করতে পারেন যা বিকল্পগুলি সমর্থন করে, যেমন

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


তুমি এটা কিভাবে জান ? বেশিরভাগ ডকুমেন্টেশন যা আমি পড়েছি তা বলে যে রেজেক্স ধীর এবং একটি LIKE% ...
ডাস্টিনাভা

5
Dba.stackexchange.com/a/10696/27757 এর মতে SIMILAR TOঅভ্যন্তরীণভাবে একটি রেজেক্স অনুসন্ধানে অনুবাদ করা হয়েছে
মার্ক কে কোয়ান

আমি মনে করি ব্যবহার lower()অকার্যকর কারণ এটি প্রথমে প্রতিটি স্ট্রিংকে লোয়ারকেসে রূপান্তরিত করবে, যা কেবলমাত্র একটি কেস-সংবেদনশীল ম্যাচের চেয়ে ব্যয়বহুল
gilad mayani

228

পোস্টগ্রাসএসকিউএল সম্পূর্ণ পসিক্স নিয়মিত এক্সপ্রেশন সমর্থন করে :

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%']);

আপনি যে কোনও অপারেটরের সাথে কোনও বুলিয়ান উত্পাদন করতে পারে তা ব্যবহার করতে পারেন। আমি সন্দেহ করি যে রেজেক্স বিকল্পগুলি দ্রুততর হবে তবে আপনার সরঞ্জামবক্সে থাকা কোনও কার্যকর সরঞ্জাম।


মজার বিষয় হল, যদিও এই দুটি পদ্ধতিই @ chmullig এর সমাধানের (সুতরাং +1) চেয়ে আরও মার্জিত, কমপক্ষে 3 টি বিকল্প চেক করার সময়, তারা বড় টেবিলগুলিতে (আমার ক্ষেত্রে 91.5 মিলিয়ন রেকর্ড) উল্লেখযোগ্যভাবে ধীর সম্পাদন করে। এগুলির দুটি ব্যবহার করার সময় আমি প্রায় 2x বাড়িয়ে দেখছিলাম। কোন ধারণা কেন হতে পারে?
সেজে 88

@ ageষি ৮৮ আমি আমার মাথার উপরের অংশটি জানি না তবে এরউইন ব্র্যান্ডসেট্টার এবং ট্রাইগ্রাম সূচকগুলি যুক্ত করতে পারে।
মিউ খুব ছোট

13

প্রকৃতপক্ষে PostgreSQL এ এর ​​জন্য একটি অপারেটর রয়েছে:

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


সুতরাং ইলিকে কি একইভাবে কোনও অ্যারে ব্যবহার করা যেতে পারে ? অভিনব রেজেক্সের প্রয়োজন না থাকলে এটি পরিষ্কার দেখাচ্ছে। বা এটি কোনওভাবেই অভ্যন্তরীণভাবে রেজেক্সে অনুবাদ করা হবে?
mlt

@ মিল্ট এটি একটি ভাল প্রশ্ন, ডকটি পড়া সুস্পষ্ট উত্তর দেয় না। SIMILAR TOনিয়মিত অভিব্যক্তিতে রূপান্তরিত করে, ~অপারেটরটি POSIX নিয়মিত এক্সপ্রেশন হিসাবে দাঁড়িয়েছে, তবে এটি এর জন্য পরিষ্কার নয় LIKE
jlandercy

0

একটি 'মার্জিত' সমাধান হ'ল সম্পূর্ণ পাঠ্য অনুসন্ধান ব্যবহার করা হবে: http://www.postgresql.org/docs/9.0/interactive/textsearch.html । তারপরে আপনি সম্পূর্ণ পাঠ্য অনুসন্ধান অনুসন্ধানগুলি ব্যবহার করবেন।


1
ডাউনভোট, কারণ এটি কেবলমাত্র একটি লিঙ্ক যা মন্তব্য হিসাবে আরও উপযুক্ত হবে।
tooraritte
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.