সমান (=) বনাম LIKE


281

এসকিউএল ব্যবহার করার সময়, এর পরিবর্তে =কোনও WHEREধারাটিতে ব্যবহারের কোনও সুবিধা আছে LIKEকি?

কোনও বিশেষ অপারেটর ছাড়া, LIKEএবং =একই, ঠিক আছে?


4
একটি ডিবি টাইপ নির্দিষ্ট করতে চান ... এমএসকিউএল, মাইএসকিএল, ওরাকল?
অ্যালেন ধান

1
আপনার প্রশ্নের মতো লাইক-অপারেটর ট্যাগের 5জন্য কমপক্ষে ভোট রয়েছে । আমি বিনীত অনুরোধ আপনার প্রস্তাবিত গেল SQL- মতো হিসেবে সমার্থক ?
কেরমিট

@ ফ্রেশপ্রিন্সঅফসো, যখন আমি যথেষ্ট খ্যাতি অর্জন করব তখন আমি তা করব। ধন্যবাদ।
ট্র্যাভিস

উত্তর:


271

বিভিন্ন অপারেটর

LIKEএবং =বিভিন্ন অপারেটর হয়। এখানে বেশিরভাগ উত্তরগুলি ওয়াইল্ডকার্ড সমর্থনকে কেন্দ্র করে, যা এই অপারেটরগুলির মধ্যে একমাত্র পার্থক্য নয়!

=একটি তুলনা অপারেটর যা সংখ্যা এবং স্ট্রিংয়ে পরিচালনা করে। স্ট্রিংগুলির সাথে তুলনা করার সময়, তুলনা অপারেটর পুরো স্ট্রিংগুলির সাথে তুলনা করে

LIKEএকটি স্ট্রিং অপারেটর যা চরিত্রের সাথে চরিত্রের তুলনা করে

বিষয়গুলিকে জটিল করার জন্য, উভয় অপারেটর একটি কোলেশন ব্যবহার করেন যা তুলনার ফলাফলের উপর গুরুত্বপূর্ণ প্রভাব ফেলতে পারে।

অনুপ্রেরণার উদাহরণ

আসুন প্রথমে একটি উদাহরণ চিহ্নিত করুন যেখানে এই অপারেটরগুলি স্পষ্টতই পৃথক ফলাফল উত্পাদন করে। আমাকে মাইএসকিউএল ম্যানুয়াল থেকে উদ্ধৃতি দেওয়ার অনুমতি দিন:

এসকিউএল স্ট্যান্ডার্ড অনুযায়ী, লাইক প্রতি-চরিত্রের ভিত্তিতে ম্যাচ সম্পাদন করে, সুতরাং এটি = তুলনা অপারেটরের থেকে পৃথক ফলাফল আনতে পারে:

mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
|                                       0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+

দয়া করে নোট করুন যে মাইএসকিউএল ম্যানুয়ালটির এই পৃষ্ঠাটিকে স্ট্রিং তুলনা ফাংশন বলা হয় , এবং =এটি আলোচনা করা হয়নি, যা বোঝায় যে =এটি স্ট্রিং তুলনা ফাংশন নয়।

কিভাবে =কাজ করে?

এসকিউএল স্ট্যান্ডার্ড § 8.2 বর্ণনা কিভাবে =স্ট্রিং তুলনা:

দুটি চরিত্রের স্ট্রিংয়ের তুলনা নীচে নির্ধারিত হয়:

ক) যদি X এর অক্ষরের দৈর্ঘ্য Y এর বর্ণের দৈর্ঘ্যের সমান না হয়, তবে তুলনার উদ্দেশ্যে, ছোট স্ট্রিং কার্যকরভাবে প্রতিস্থাপন করা হবে, নিজের একটি অনুলিপি যা দীর্ঘ স্ট্রিংয়ের দৈর্ঘ্যে প্রসারিত করা হয়েছে এক বা একাধিক প্যাড অক্ষরের ডানদিকে একযোগে, যেখানে প্যাড অক্ষর সিএস এর উপর ভিত্তি করে বেছে নেওয়া হয়েছে। যদি সিএসের কোনও পিএডি বৈশিষ্ট্য থাকে, তবে প্যাড অক্ষরটি এক্স এবং ওয়াইয়ের চরিত্রের যে কোনও অক্ষরের চেয়ে সিএস এর অধীনে কম স্ট্রাইটের চেয়ে কম অংশীদারীকরণ-নির্ভর চরিত্র। অন্যথায়, প্যাডের চরিত্রটি একটি।

খ) এক্স এবং ওয়াইয়ের তুলনার ফলাফলটি কোলাটিং সিকোয়েন্স সিএস দ্বারা দেওয়া হয়েছে।

গ) কোলটিং ক্রমের উপর নির্ভর করে দুটি স্ট্রিং সমান হিসাবে তুলনা করতে পারে যদিও সেগুলি বিভিন্ন দৈর্ঘ্যের হয় বা বিভিন্ন বর্ণের ক্রম থাকে। যখন অপারেশনস MAX, MIN, DISTINCT, একটি গ্রুপিং কলামের উল্লেখ, এবং ইউনিয়ন, EXCEPT, এবং ইন্টারস্যাক্ট অপারেটরগুলি চরিত্রের স্ট্রিংগুলিকে উল্লেখ করে, তখন এই সমান মানগুলির একটি সেট থেকে এই ক্রিয়াকলাপগুলির দ্বারা নির্বাচিত নির্দিষ্ট মান প্রয়োগ-নির্ভর।

(সামনে জোর দাও.)

এটার মানে কি? এর অর্থ হ'ল স্ট্রিংগুলির তুলনা করার সময় =অপারেটরটি বর্তমান কোলেশনটির চারপাশে কেবল একটি পাতলা মোড়ক। একটি কলেজ একটি লাইব্রেরি যা স্ট্রিং তুলনা বিভিন্ন নিয়ম আছে। এখানে মাইএসকিউএল থেকে বাইনারি সংযোগের উদাহরণ রয়েছে :

static int my_strnncoll_binary(const CHARSET_INFO *cs __attribute__((unused)),
                               const uchar *s, size_t slen,
                               const uchar *t, size_t tlen,
                               my_bool t_is_prefix)
{
  size_t len= MY_MIN(slen,tlen);
  int cmp= memcmp(s,t,len);
  return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen);
}

এই নির্দিষ্ট জোটটি বাই-বাই-বাইটের তুলনা করতে ঘটে (যার কারণে এটি "বাইনারি" বলা হয় - এটি স্ট্রিংগুলিতে কোনও বিশেষ অর্থ দেয় না)। অন্যান্য সংস্থানগুলি আরও উন্নত তুলনা প্রদান করতে পারে।

উদাহরণস্বরূপ, এখানে একটি ইউটিএফ -8 কোলেশন রয়েছে যা কেস-সংবেদনশীল তুলনা সমর্থন করে। কোডটি এখানে পেস্ট করার জন্য খুব দীর্ঘ, তবে সেই লিঙ্কটিতে যান এবং এর বডিটি পড়ুন my_strnncollsp_utf8mb4()। এই জোটটি একসাথে একাধিক বাইট প্রক্রিয়া করতে পারে এবং এটি বিভিন্ন রূপান্তরগুলি প্রয়োগ করতে পারে (যেমন কেস সংবেদনশীল তুলনা)। =অপারেটর সম্পূর্ণরূপে কোলেশন এর অনেকাংশে থেকে আনমনা হয়।

কিভাবে LIKEকাজ করে?

এসকিউএল স্ট্যান্ডার্ড § 8.5 বর্ণনা কিভাবে LIKEস্ট্রিং তুলনা:

<প্রেডিকেট>

M LIKE P

সত্য আছে যদি সাব-স্ট্রিংগুলিতে এম এর বিভাজন থাকে যেমন:

i) এম এর একটি স্ট্রিংিং এম এর 0 বা তার বেশি সংলগ্ন <চরিত্রের প্রতিনিধিত্ব> এর ক্রম এবং এম এর প্রতিটি <অক্ষর প্রতিনিধিত্ব> হ'ল একটি স্ট্রিংয়ের অংশ।

ii) পি এর আই-তম স্ট্রিংয়ের স্পেসিফায়ার যদি একটি স্বেচ্ছাচারিতা চরিত্রের নির্দিষ্টকরণকারী হয় তবে এম এর আই-তম স্ট্রিংটি কোনও একক <অক্ষরের প্রতিনিধিত্ব>।

iii) যদি পি এর আই-তম স্ট্রিং স্পেসিফায়ারটি একটি স্বেচ্ছাসেবী স্ট্রিং স্পেসিফায়ার হয় তবে এম এর আই-তম স্ট্রিংটি 0 বা ততোধিক <চরিত্রের প্রতিনিধিত্ব> এর কোনও ক্রম।

iv) যদি পি এর আই-তম স্ট্রিংং স্পেসিফারটি না হয় একটি স্বেচ্ছাকৃতির চরিত্র নির্দিষ্টকারক বা সালিশী স্ট্রিং নির্দিষ্টকরণকারক না হয়, তবে এম এর আই-তম স্ট্রিংিং <প্রেডিকেট এর মতো> এর কোলাটিং ক্রম অনুসারে সেই স্ট্রিংং স্পেসিফায়ারের সমান, এমকে <স্পেস> অক্ষর যুক্ত করার সাথে এর স্ট্রিংং স্পেসিফায়ারের সমান দৈর্ঘ্য রয়েছে।

v) এম এর সাবস্ট্রিংয়ের সংখ্যা পি এর সাবস্ট্রিং স্পেসিফায়ার সংখ্যার সমান is

(সামনে জোর দাও.)

এটি বেশ কথামূলক, সুতরাং আসুন এটি ভেঙে দিন। চলছে ii ও iii ওয়াইল্ডকার্ড পড়ুন _এবং %যথাক্রমে। যদি Pকোনও ওয়াইল্ডকার্ড না থাকে তবে কেবল iv আইটেম প্রয়োগ হয়। এটি ওপি কর্তৃক উত্সাহিত আগ্রহের ঘটনা।

এই ক্ষেত্রে এটি বর্তমান কোলেশন ব্যবহার করে Mপ্রতিটি স্ট্রস্ট্রিংয়ের বিপরীতে প্রতিটি "স্ট্রিং" (স্বতন্ত্র অক্ষর) তুলনা করে P

উপসংহার

নীচের লাইনটি হল স্ট্রিংগুলির =সাথে তুলনা করার সময় পুরো স্ট্রিংটির সাথে তুলনা করা হয় এবং একই LIKEসাথে একটি অক্ষরের সাথে তুলনা করা হয়। উভয় তুলনা বর্তমান কোলেশন ব্যবহার করে। এই পোস্টে প্রথম উদাহরণে প্রমাণ হিসাবে এই পার্থক্যটি কিছু ক্ষেত্রে বিভিন্ন ফলাফলের দিকে নিয়ে যায়।

কোনটি আপনার ব্যবহার করা উচিত? কেউ আপনাকে এটি বলতে পারে না - আপনার ব্যবহারের ক্ষেত্রে সঠিক যেটি ব্যবহার করা উচিত use তুলনা অপারেটরগুলি স্যুইচ করে অকালপূর্বক অনুকূলিত হন না।


4
"EQUALS বাইট দ্বারা ডেটা টুকরো টুকরো তুলনা করে": ওভারসিম্প্লিফাইড, এবং খুব প্রায়ই সত্য হয় না, কারণ EQUALS (=) আচরণটি পরিবর্তনের মাধ্যমে বর্ণের পরিবর্তে অক্ষরের পরিবর্তে অক্ষর শ্রেণি তুলনা করা যায়। যেমন দেখুন dev.mysql.com/doc/refman/5.0/en/charset-collate.html (মাইএসকিউএল) বা sqlmag.com/blog/forcing-collation-where-clause-22-jun-2011 (এসকিউএল সার্ভার)।
পিটার বি

11
এটি সঠিক উত্তর। আমরা জানি কী LIKEহয় তবে এই উত্তরটি দুর্দান্তভাবে ব্যাখ্যা করে যে ব্যবহার করা বা বর্তমান LIKEছাড়া ব্যবহার করা মোটেও ব্যবহারের মতো নয় । আপনার উত্তরটি হাজার উপার্জন পেতে পারে। %_=
রিনোগো ২৩ শে

1
@ ম্যাসেজ এটি সত্য হতে পারে না। যদি আমার বার্চার ক্ষেত্রের মান থাকে 'AbCdEfG'এবং আমি তা WHERE MyCol = 'abcdefg'করি তবে আমি এখনও সেই সারিটি ফিরিয়ে আনতে পারি, যদিও তারা স্পষ্টভাবে বাই-বাই-বাইট সমতুল্য নয়
কিপ

1
পিটারবি এবং @ কিপ উভয়ই ভাল পয়েন্ট উত্থাপন করে। কোলেশন কীভাবে এই অপারেটরগুলিকে প্রভাবিত করে তা ব্যাখ্যা করার চেষ্টা করার জন্য আমি আমার উত্তরকে উন্নত করেছি।
মার্ক ই। হাজেস

2
এটি আর সত্য বলে মনে হয় না: set charset latin1; SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;0 SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;দেয় এবং 0 দেয়।
joanq

170

সমান (=) অপারেটর একটি "তুলনা অপারেটর সমতার জন্য দুটি মানের তুলনা করে।" অন্য কথায়, একটি এসকিউএল বিবৃতিতে, সমীকরণের উভয় দিক সমান না হলে এটি সত্য হবে না। উদাহরণ স্বরূপ:

SELECT * FROM Store WHERE Quantity = 200;

LIKE অপারেটর "" একটি প্যাটার্ন ম্যাচ তুলনা প্রয়োগ করে "যা" ওয়াইল্ড-কার্ড অক্ষরযুক্ত প্যাটার্নের স্ট্রিংয়ের সাথে একটি স্ট্রিং মান "মেলাতে চেষ্টা করে। উদাহরণ স্বরূপ:

SELECT * FROM Employees WHERE Name LIKE 'Chris%';

লাইক সাধারণত স্ট্রিং এবং সমান (সাধারণত আমি বিশ্বাস করি) দিয়ে দ্রুত ব্যবহৃত হয়। সমতুল্য অপারেটর ওয়াইল্ড কার্ডের অক্ষরগুলিকে আক্ষরিক অক্ষর হিসাবে বিবেচনা করে। প্রত্যাবর্তিত ফলাফলের পার্থক্য নিম্নরূপ:

SELECT * FROM Employees WHERE Name = 'Chris';

এবং

SELECT * FROM Employees WHERE Name LIKE 'Chris';

একই ফলাফলটি ফিরিয়ে আনবে, যদিও লাইক ব্যবহার করা সাধারণত এটি প্যাটার্ন ম্যাচ হিসাবে আরও বেশি সময় নেয়। যাহোক,

SELECT * FROM Employees WHERE Name = 'Chris%';

এবং

SELECT * FROM Employees WHERE Name LIKE 'Chris%';

বিভিন্ন ফলাফল ফিরে আসবে, যেখানে "=" ব্যবহারের ফলে কেবল "ক্রিস%" প্রত্যাবর্তনের ফলাফল আসে এবং LIKE অপারেটর "ক্রিস" দিয়ে শুরু করে যে কোনও কিছু ফিরিয়ে আনবে।

আশা করি এইটি কাজ করবে. কিছু ভাল তথ্য এখানে পাওয়া যাবে


108
আমি এই ধারণাটির আওতায় রয়েছি যে ওপি জানে কখন লাইক ব্যবহার করতে হয় এবং কখন ব্যবহার করতে হয় = তিনি কেবল ভাবছেন যে কোনও ওয়াইল্ডকার্ড উপস্থিত না থাকলে পারফরম্যান্সের পার্থক্য রয়েছে কিনা। এই উত্তরটি সংক্ষেপে এটিকে স্পর্শ করে তবে আমি অনুভব করি যে এই উত্তরটির 95% সত্যই প্রাসঙ্গিক নয়।
আউটলা প্রোগ্রামার

1
খুবই সত্য. আমি যখন উত্তর দিয়েছি তখন প্রশ্নটি একই ছিল কিনা তা আমি নিশ্চিত নই। যদি এটি হয়, আমি পারফরম্যান্স সম্পর্কে জিজ্ঞাসা অংশ মিস করেছি। পর্যবেক্ষণের জন্য ধন্যবাদ।
অচিনদা 99

9
এই উত্তরটি ভয়ানক। লাইক এবং '=' সম্পূর্ণ স্বতন্ত্র অপারেটর, তবে কিছু ছোট ছোট সাবসেটের ক্ষেত্রে একইভাবে আচরণ করা ঘটবে। উত্তরোত্তর স্বার্থে, দয়া করে এখানে বাকি উত্তরগুলি পড়ুন বা কমপক্ষে গুগল "মাইএসকিএল লাইক" এর জন্য আপনি এটিকে স্মৃতিতে প্রতিশ্রুতি দেওয়ার আগে।
মার্ক ই। হাজেস

3
অন্যদিকে, এই উত্তরটি আমার দেওয়া প্রশ্নের উত্তর দিয়েছিল এবং গুগল করেছিলাম। কখনও কখনও এটি ঠিক যেমন উত্তরের উত্তর হিসাবে একটি প্রশ্নের শিরোনাম উত্তর হিসাবে বিষয়বস্তু।
CorayThan

আপনি যখন চর এবং ভারচার 2 ব্যবহার করছেন তখন মনে রাখা ভাল think আপনি যদি চরের সাথে চরের তুলনা করেন। ডাটাবেসটির তুলনা করার আগে প্রথমে প্রথম 'ভেরিয়েবল'র দৈর্ঘ্যকে দ্বিতীয়টির সাথে একই রূপান্তর করুন। আপনি চর এবং varchar2 তুলনা করে ডাটাবেস কিছুই করবে না। docs.oracle.com/cd/A64702_01/doc/server.805/a58236/c_char.htm
xild

18

এটি এসকিউএল'র মতো 'বনাম' = 'পারফরম্যান্সের জন্য আমার অন্য উত্তরের একটি অনুলিপি / পেস্ট :

মাইএসকিএল 5.5 ব্যবহার করে একটি ব্যক্তিগত উদাহরণ: আমার 2 টি টেবিলের মধ্যে একটি অভ্যন্তরীণ যোগসূত্র ছিল, 3 মিলিয়ন সারিগুলির মধ্যে একটি এবং 10 হাজার সারিগুলির মধ্যে একটি।

নীচে হিসাবে কোনও সূচকগুলিতে কোনও পছন্দ ব্যবহার করার সময় (কোনও ওয়াইল্ডকার্ড নেই), এটি প্রায় 30 সেকেন্ড সময় নিয়েছিল:

where login like '12345678'

আমি বুঝি 'ব্যাখ্যা' ব্যবহার করে:

এখানে চিত্র বর্ণনা লিখুন

একই ক্যোয়ারিতে একটি '=' ব্যবহার করার সময় এটি প্রায় 0.1 সেকেন্ড সময় নিয়েছিল:

where login ='12345678'

আমি বুঝি 'ব্যাখ্যা' ব্যবহার করে:

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন, likeসূচকটি সম্পূর্ণরূপে বাতিল হয়ে গেছে, সুতরাং ক্যোয়ারীতে আরও 300 বার বেশি সময় লেগেছে।


17

LIKEএবং =বিভিন্ন। LIKEআপনি অনুসন্ধান অনুসন্ধানে যা ব্যবহার করবেন তা হ'ল। এটি _(সাধারণ চরিত্রের ওয়াইল্ডকার্ড) এবং %(বহু-চরিত্রের ওয়াইল্ডকার্ড) এর মতো ওয়াইল্ডকার্ডগুলিকেও অনুমতি দেয় ।

= আপনি যদি সঠিক ম্যাচগুলি চান তা ব্যবহার করা উচিত এবং এটি আরও দ্রুত হবে।

এই সাইটটি ব্যাখ্যা করে LIKE


11

একটি পার্থক্য - LIKE এর সাথে ওয়াইল্ডকার্ড ব্যবহারের সম্ভাবনা বাদে - পিছনের জায়গাগুলিতে: = অপারেটর পিছনে স্থানটিকে উপেক্ষা করে, তবে লাইক করে না does


4
এটি মাইএসকিউএল এবং এমএস এসকিউএল-এর ক্ষেত্রে সত্য হলেও এটি পোস্টগ্র্রেএসকিউএল-এর জন্য নয়।
ব্রুনো

10

ডাটাবেস সিস্টেমের উপর নির্ভর করে।

সাধারণত কোনও বিশেষ অক্ষর না থাকলে হ্যাঁ, = এবং লাইক একই হয় are

কিছু ডাটাবেস সিস্টেম, বিভিন্ন অপারেটরগুলির সাথে কোলেশন সেটিংসকে আলাদাভাবে আচরণ করতে পারে।

উদাহরণস্বরূপ, মাইএসকিউএল এর সাথে = অন স্ট্রিংয়ের তুলনাগুলি সর্বদা ডিফল্টরূপে কেস-সংবেদনশীল থাকে তাই বিশেষ অক্ষর ছাড়া LIKE একই হয়। অন্য কিছু আরডিবিএমএসের মতো লাইক কেস-সংবেদনশীল হয় যখন = হয় না।


এই বিজোড়তার জন্য ওভারভিউয়ের মতো কিছু আছে কি?
গম্বো

9

এই উদাহরণের জন্য আমরা এটি গ্রহণযোগ্যভাবে বিবেচনা করি যে ভার্চারকোলটিতে ''এই কলামটির বিপরীতে কোনও খালি ঘর নেই

select * from some_table where varcharCol = ''
select * from some_table where varcharCol like ''

প্রথমটি 0 টি সারি আউটপুটে ফলাফল যখন দ্বিতীয়টি পুরো তালিকাটি দেখায়। ফিল্টারের মতো কাজ করার সময় = কঠোরভাবে ম্যাচের ক্ষেত্রে। যদি ফিল্টারটির কোনও মানদণ্ড না থাকে তবে প্রতিটি ডেটা বৈধ।

যেমন - এর উদ্দেশ্য অনুসারে এটি কিছুটা ধীর গতিতে কাজ করে এবং বর্ণচক্র এবং অনুরূপ ডেটা ব্যবহারের জন্য তৈরি।


6

আপনি যদি কোনও সঠিক মিলের জন্য অনুসন্ধান করেন তবে আপনি = এবং LIKE উভয়ই ব্যবহার করতে পারেন।

এই ক্ষেত্রে "=" ব্যবহার করা খুব সামান্য দ্রুত (সঠিক মিলের সন্ধান করা) - আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে দু'বার একই ক্যোয়ারী রেখে, একবার "=" ব্যবহার করে একবার "লাইক" ব্যবহার করে পরীক্ষা করে দেখতে পারেন এবং তারপরে "ক্যোয়ারী" / "প্রকৃত বাস্তবায়ন পরিকল্পনা অন্তর্ভুক্ত করুন" ব্যবহার করে।

দুটি প্রশ্নের এক্সিকিউট করুন এবং আপনার ফলাফল দুটিবার দেখতে হবে এবং দুটি বাস্তব বাস্তবায়ন পরিকল্পনা রয়েছে। আমার ক্ষেত্রে, এগুলি 50% বনাম 50% বিভক্ত হয়েছিল, তবে "=" এক্সিকিউশন পরিকল্পনার একটি ছোট "আনুমানিক সাবট্রি ব্যয়" রয়েছে (যখন আপনি বাম-সর্বাধিক "নির্বাচন" বাক্সের উপরে ঘুরে দেখেন) - তবে আবার এটি সত্যই একটি বিশাল পার্থক্য না।

আপনি যখন নিজের পছন্দ মত অভিব্যক্তিগুলিতে ওয়াইল্ডকার্ডগুলি দিয়ে অনুসন্ধান শুরু করবেন তখন অনুসন্ধানের কর্মক্ষমতা হ্রাস পাবে। "লাইক মিল%" অনুসন্ধানটি এখনও বেশ দ্রুত হতে পারে - এসকিউএল সার্ভার সেই কলামে একটি সূচক ব্যবহার করতে পারে, যদি সেখানে থাকে। "LIKE% এক্সপ্রেশন%" অনুসন্ধান করা মারাত্মকভাবে ধীর, যেহেতু এসকিউএল সার্ভার এই অনুসন্ধানটি সন্তুষ্ট করতে পারে কেবল একটি সম্পূর্ণ টেবিল স্ক্যান করে। তাই আপনার লাইক দিয়ে সাবধান!

আঙ্গুরের ছিরড়া


-1 না হিসাবে, এটি সবসময় সামান্য কিছুটা দ্রুত হয় না। যদি কলামটি% মাইস্ট্রিং% ব্যবহার করে সূচিযুক্ত হয় তবে প্রস্থের ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কম হওয়া উচিত। প্রকৃতপক্ষে তাদের লবণের যে কোনও কোডের মানদণ্ডে কখন এবং কখন একটি মিকি মাউস ডাটাবেসের চেয়ে বড় কোনওর মতো পছন্দ না করার বিষয়ে কঠোর নির্দেশিকা থাকবে।
ক্রুয়াচান

1
আমি কখনই বলিনি যে এটি সমস্ত ক্ষেত্রে খুব সামান্য ধীর হবে - আমি বলেছিলাম যে আপনি যদি কোনও সত্যিকারের ম্যাচটি অনুসন্ধান করেন তবে এটি একটি সামান্য বিট ধীর হবে। মাউসের ক্ষেত্রে, পছন্দ মতো অনুসন্ধান করা এবং ওয়াইল্ডকার্ডগুলি ব্যবহার করা, বিশেষত আপনার অনুসন্ধান আইটেমের শুরু এবং শেষের দিকে, খুব ধীরে ধীরে, এ সম্পর্কে কোনও সন্দেহ নেই।
marc_s

এবং হ্যাঁ, আমি সম্মত - একটি উচিত যখন মত ব্যবহার করুন অথবা না (শুধুমাত্র যখন আপনি ওয়াইল্ডকার্ড দিয়ে অনুসন্ধান করতে প্রয়োজন) করতে যেমন পরিস্কার নীতি নির্দেশ আছে। তবে তারপরেও - তত্ত্বের ক্ষেত্রে তত্ত্ব এবং অনুশীলনের মধ্যে কোনও পার্থক্য নেই, তবে অনুশীলনে .......
মার্ক_স

6

আপনি রান সময়ে ক্যোয়ারি তৈরি করার সময় স্ট্রিংয়ের সাথে ওয়াইল্ডকার্ডস এবং বিশেষ অক্ষরের দ্বন্দ্বগুলি এড়ানো = ব্যবহার করা এড়ানো যায়।

এটি LIKE ধারাটিতে পিছলে যেতে পারে এমন সমস্ত বিশেষ ওয়াইল্ডকার্ড চরিত্রগুলি এড়িয়ে না যাওয়ার এবং উদ্দেশ্যযুক্ত ফলাফল না তৈরি করে প্রোগ্রামারের জীবনকে আরও সহজ করে তোলে। সর্বোপরি, = হ'ল 99% ব্যবহারের ক্ষেত্রে, এটি প্রতিবার এড়াতে পারা ব্যথা হবে।

'90 এর দশকে চোখ বুলায়

আমি এটিকে কিছুটা ধীর করেও সন্দেহ করি, তবে বিন্যাসে কোনও ওয়াইল্ডকার্ড না থাকলে আমার তা সন্দেহজনক।


6

কর্মক্ষমতা সম্পর্কিত মূল প্রশ্নটির সমাধান করতে, এটি সূচকের ব্যবহারের দিকে নেমে আসে । যখন একটি সাধারণ টেবিল স্ক্যান ঘটে তখন "LIKE" এবং "=" অভিন্ন । সূচকগুলি জড়িত থাকাকালীন এটি LIKE ধারাটি কীভাবে তৈরি হয় তার উপর নির্ভর করে। আরও নির্দিষ্টভাবে বলা যায়, ওয়াইল্ডকার্ডের অবস্থান কী?


নিম্নোক্ত বিবেচনা কর:

CREATE TABLE test(
    txt_col  varchar(10) NOT NULL
)
go

insert test (txt_col)
select CONVERT(varchar(10), row_number() over (order by (select 1))) r
  from master..spt_values a, master..spt_values b
go

CREATE INDEX IX_test_data 
    ON test (txt_col);
go 

--Turn on Show Execution Plan
set statistics io on

--A LIKE Clause with a wildcard at the beginning
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '%10000'
--Results in
--Table 'test'. Scan count 3, logical reads 15404, physical reads 2, read-ahead reads 15416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index SCAN is 85% of Query Cost

--A LIKE Clause with a wildcard in the middle
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '1%99'
--Results in
--Table 'test'. Scan count 1, logical reads 3023, physical reads 3, read-ahead reads 3018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost for test data, but it may result in a Table Scan depending on table size/structure

--A LIKE Clause with no wildcards
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '10000'
--Results in
--Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost
GO

--an "=" clause = does Index Seek same as above
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col = '10000'
--Results in
--Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost
GO


DROP TABLE test

"=" বনাম "লাইক" ব্যবহার করার সময় ক্যোয়ারি প্ল্যান তৈরির ক্ষেত্রেও নগণ্য পার্থক্য থাকতে পারে।


4

ওয়াইল্ডকার্ড এছাড়া মধ্যে পার্থক্য =এবং LIKEউভয় SQL সার্ভার ধরনের এবং কলাম ধরনের উপর উপর নির্ভর করবে।

এই উদাহরণটি ধরুন:

CREATE TABLE testtable (
  varchar_name VARCHAR(10),
  char_name CHAR(10),
  val INTEGER
);

INSERT INTO testtable(varchar_name, char_name, val)
    VALUES ('A', 'A', 10), ('B', 'B', 20);

SELECT 'VarChar Eq Without Space', val FROM testtable WHERE varchar_name='A'
UNION ALL
SELECT 'VarChar Eq With Space', val FROM testtable WHERE varchar_name='A '
UNION ALL
SELECT 'VarChar Like Without Space', val FROM testtable WHERE varchar_name LIKE 'A'
UNION ALL
SELECT 'VarChar Like Space', val FROM testtable WHERE varchar_name LIKE 'A '
UNION ALL
SELECT 'Char Eq Without Space', val FROM testtable WHERE char_name='A'
UNION ALL
SELECT 'Char Eq With Space', val FROM testtable WHERE char_name='A '
UNION ALL
SELECT 'Char Like Without Space', val FROM testtable WHERE char_name LIKE 'A'
UNION ALL
SELECT 'Char Like With Space', val FROM testtable WHERE char_name LIKE 'A '
  • এমএস এসকিউএল সার্ভার ২০১২ ব্যবহার করে , LIKEকলামের ধরণটি বাদে পিছনের স্থানগুলি তুলনা করে উপেক্ষা করা হবে VARCHAR

  • ব্যবহার মাইএসকিউএল 5.5 , পিছনের শূন্যস্থানগুলি জন্য উপেক্ষা করা হবে =, কিন্তু না LIKE, সঙ্গে উভয় CHARএবং VARCHAR

  • PostgreSQL 9.1 ব্যবহার করে , স্পেসগুলি উভয়ই =এবং LIKEব্যবহারের সাথে উল্লেখযোগ্য VARCHAR, তবে CHAR( ডকুমেন্টেশন দেখুন ) দিয়ে নয়।

    সাথে আচরণও LIKEআলাদা হয় CHAR

    উপরের মত একই ডেটা ব্যবহার CASTকরে, কলামের নামটিতে একটি স্পষ্ট ব্যবহার করাও একটি তাত্পর্য সৃষ্টি করে :

    SELECT 'CAST none', val FROM testtable WHERE char_name LIKE 'A'
    UNION ALL
    SELECT 'CAST both', val FROM testtable WHERE
        CAST(char_name AS CHAR) LIKE CAST('A' AS CHAR)
    UNION ALL
    SELECT 'CAST col', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE 'A'
    UNION ALL
    SELECT 'CAST value', val FROM testtable WHERE char_name LIKE CAST('A' AS CHAR)

    এটি কেবল "CAST উভয়" এবং "CAST করল" এর জন্য সারি প্রদান করে।


2

লাইক কীওয়ার্ড নিঃসন্দেহে একটি "পারফরম্যান্স মূল্য-ট্যাগ" সংযুক্ত সঙ্গে আসে with এটি বলেছিল, আপনার কাছে যদি কোনও ইনপুট ক্ষেত্র থাকে যা আপনার ক্যোয়ারীতে ওয়াইল্ড কার্ডের অক্ষরগুলি অন্তর্ভুক্ত করতে পারে তবে আমি যদি কেবল ইনপুটটিতে বন্য কার্ডের অন্তর্ভুক্ত থাকে তবে LIKE ব্যবহারের পরামর্শ দেব । অন্যথায় তুলনা করার সমান স্ট্যান্ডার্ডটি ব্যবহার করুন।

শুভেচ্ছান্তে...


1

সত্যিই এটি আপনি কী জিজ্ঞাসা করতে চান তা নেমে আসে। যদি আপনি একটি সঠিক মিলটি বোঝাতে চান তবে = ব্যবহার করুন। যদি আপনি কোনও ফাজি ম্যাচ বোঝায় তবে লাইকটি ব্যবহার করুন। আপনার অর্থ কী বলা তা সাধারণত কোড সহ একটি ভাল নীতি।


1

ওরাকল-এ 'ওয়াইল্ডকার্ডসহীন' 'লাইক' একই ফলটিকে 'সমান' হিসাবে ফিরিয়ে দেবে, তবে অতিরিক্ত প্রক্রিয়াজাতকরণের প্রয়োজন হতে পারে। টম কিটের মতে , ওরাকল আক্ষরিক ব্যবহার করার সময় কোনও ওয়াইল্ডকার্ডের সাথে 'সমান' হিসাবে বিবেচনা করবে না, তবে বাইন্ড ভেরিয়েবল ব্যবহার করার সময় নয়।


0

=এবং LIKEএকই নয়;

  1. = সঠিক স্ট্রিংয়ের সাথে মেলে
  2. LIKE ওয়াইল্ডকার্ড (%) থাকতে পারে এমন একটি স্ট্রিংয়ের সাথে মেলে

2
অপর্যাপ্ত উত্তর

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