মূল প্রশ্নটি ছিল "আমি কীভাবে কোনও ক্যোয়ারিকে প্যারামিটারাইজ করব ..."
আমাকে এখনই জানিয়ে দিন, এটি মূল প্রশ্নের উত্তর নয় । অন্যান্য ভাল উত্তরে ইতিমধ্যে এর কিছু বিক্ষোভ রয়েছে।
এই বলে দিয়েছিলেন, এগিয়ে যান এবং এই উত্তরটি পতাকাঙ্কিত করুন, এটিকে নিম্নোক্ত করুন, উত্তর হিসাবে চিহ্নিত করুন না ... আপনি যা বিশ্বাস করেন ঠিক তাই করুন।
আমি (এবং অন্য 231 জন) যে পছন্দসই উত্তরে উত্তোলন করেছি সেই পছন্দসই উত্তরের জন্য মার্ক ব্র্যাকেটের উত্তর দেখুন। তার উত্তরে প্রদত্ত পদ্ধতির সাহায্যে 1) বাইন্ড ভেরিয়েবলের কার্যকর ব্যবহারের জন্য এবং 2) পূর্বাভাসের জন্য ব্যয় করতে সক্ষম হবে।
নির্বাচিত উত্তর
আমি এখানে যা সম্বোধন করতে চাই তা হ'ল জোয়েল স্পলস্কির উত্তরে দেওয়া পদ্ধতির উত্তরটি সঠিক উত্তর হিসাবে "নির্বাচিত"।
জোল স্পলস্কির পদ্ধতির চালাক। এবং এটি যুক্তিসঙ্গতভাবে কাজ করে, এটি অনুমানযোগ্য আচরণ এবং অনুমানযোগ্য পারফরম্যান্স প্রদর্শন করতে চলেছে, "সাধারণ" মানগুলি দেওয়া হয় এবং NUL এবং খালি স্ট্রিংয়ের মতো আদর্শ প্রান্তের ক্ষেত্রে। এবং এটি কোনও নির্দিষ্ট প্রয়োগের জন্য যথেষ্ট হতে পারে be
তবে এই পদ্ধতির সাধারণীকরণের ক্ষেত্রে, আসুন আরও অস্পষ্ট কোণার কেসগুলিও বিবেচনা করুন, যেমন Name
কলামটিতে ওয়াইল্ডকার্ডের অক্ষর রয়েছে (যেমন লাইক প্রিকেট দ্বারা স্বীকৃত)) আমি যে ওয়াইল্ডকার্ড চরিত্রটি দেখতে পাই যা সবচেয়ে বেশি ব্যবহৃত হয় তা হ'ল %
(শতাংশের চিহ্ন)। সুতরাং আসুন এখন এখানে এটি মোকাবেলা, এবং পরে অন্যান্য ক্ষেত্রে যেতে হবে।
% চরিত্র নিয়ে কিছু সমস্যা
একটি নামের মান বিবেচনা করুন 'pe%ter'
। (এখানে উদাহরণগুলির জন্য, আমি কলামের নামের জায়গায় একটি আক্ষরিক স্ট্রিং মান ব্যবহার করি)) pe 'পে% টের' নামের একটি মান সহ একটি সারি ফর্মের কোয়েরিতে ফিরে আসবে:
select ...
where '|peanut|butter|' like '%|' + 'pe%ter' + '|%'
তবে সেই একই সারিটি হবে না অনুসন্ধানের পদগুলির ক্রমটি বিপরীত হলে ফেরানো :
select ...
where '|butter|peanut|' like '%|' + 'pe%ter' + '|%'
আমরা যে আচরণটি পর্যবেক্ষণ করি তা এক ধরণের বিজোড়। তালিকায় অনুসন্ধান শর্তাবলী ক্রম পরিবর্তন ফলাফল পরিবর্তন করে।
এটি প্রায় না বলে চলে যায় যে আমরা নাও চাই pe%ter
চিনাবাদাম মাখনের সাথে মেলাতে , তার যতই পছন্দ হোক না কেন।
অস্পষ্ট কোণার কেস
(হ্যাঁ, আমি সম্মত হব যে এটি একটি অস্পষ্ট মামলা Pro সম্ভবত এটির পরীক্ষা করার সম্ভাবনা নেই a আমরা কলামের মানে কোনও ওয়াইল্ডকার্ডের আশা করবো না ass আমরা ধরে নিতে পারি যে অ্যাপ্লিকেশনটি এই জাতীয় মান সংরক্ষণ করা থেকে বিরত করে But তবে আমার অভিজ্ঞতায় আমি খুব কমই এমন একটি ডাটাবেস সীমাবদ্ধতা দেখেছি যা বিশেষত অক্ষরের বা নিদর্শনগুলিকে অস্বীকার করে যা একটি ডানদিকে ওয়াইল্ডকার্ড হিসাবে বিবেচিত হবে LIKE
তুলনামূলক অপারেটরের ।
একটি গর্ত প্যাচিং
এই গর্তটি প্যাচ করার জন্য একটি উপায় হ'ল %
ওয়াইল্ডকার্ড চরিত্রটি এড়ানো । (অপারেটরের পলায়ন ধারাটির সাথে পরিচিত না এমন কারও জন্য, এসকিউএল সার্ভার ডকুমেন্টেশনের লিঙ্ক এখানে ।
select ...
where '|peanut|butter|'
like '%|' + 'pe\%ter' + '|%' escape '\'
এখন আমরা আক্ষরিক% মেলতে পারি। অবশ্যই, যখন আমাদের একটি কলামের নাম থাকবে, আমাদের গতিশীলভাবে ওয়াইল্ডকার্ড থেকে পালাতে হবে। আমরা REPLACE
ফাংশনটি %
চরিত্রের উপস্থিতিগুলি সন্ধান করতে এবং প্রত্যেকের সামনে একটি ব্যাকস্ল্যাশ অক্ষর সন্নিবেশ করতে পারি:
select ...
where '|pe%ter|'
like '%|' + REPLACE( 'pe%ter' ,'%','\%') + '|%' escape '\'
সুতরাং এটি% ওয়াইল্ডকার্ড দিয়ে সমস্যার সমাধান করে। প্রায়।
পালাও পালাও
আমরা বুঝতে পারি যে আমাদের সমাধানটি আরও একটি সমস্যা চালু করেছে। পালানোর চরিত্র। আমরা দেখতে পাচ্ছি যে আমাদেরও পালানোর চরিত্রের যে কোনও ঘটনা থেকে নিজেকে বাঁচতে হবে। এবার, আমরা ব্যবহার! পালানোর চরিত্র হিসাবে:
select ...
where '|pe%t!r|'
like '%|' + REPLACE(REPLACE( 'pe%t!r' ,'!','!!'),'%','!%') + '|%' escape '!'
আন্ডারস্কোরও
এখন যেহেতু আমরা একটি রোল করছি, আমরা অন্য একটি REPLACE
হ্যান্ডেলটিকে আন্ডারস্কোর ওয়াইল্ডকার্ড যুক্ত করতে পারি । এবং কেবল মজাদার জন্য, এবার, আমরা the পালানোর চরিত্র হিসাবে ব্যবহার করব।
select ...
where '|p_%t!r|'
like '%|' + REPLACE(REPLACE(REPLACE( 'p_%t!r' ,'$','$$'),'%','$%'),'_','$_') + '|%' escape '$'
আমি পালানোর পক্ষে এই পদ্ধতির পছন্দ করি কারণ এটি ওরাকল এবং মাইএসকিউএল পাশাপাশি এসকিউএল সার্ভারেও কাজ করে। (আমি সাধারণত পালানোর চরিত্র হিসাবে \ ব্যাকস্ল্যাশ ব্যবহার করি, যেহেতু আমরা নিয়মিত অভিব্যক্তিগুলিতেই সেই চরিত্রটি ব্যবহার করি But তবে কেন কনভেনশনে বাধা থাকবেন!
P অসাধারণ বন্ধনীগুলি
এসকিউএল সার্ভার এছাড়াও ওয়াইল্ডকার্ড অক্ষরগুলিকে বন্ধনীতে আবদ্ধ করে তাকে আক্ষরিক হিসাবে বিবেচনা করার অনুমতি দেয় []
। সুতরাং আমরা কমপক্ষে এসকিউএল সার্ভারের জন্য এখনও ঠিক করতে পারিনি। যেহেতু জোড়া বন্ধনীগুলির বিশেষ অর্থ রয়েছে, তাই আমাদের সেগুলিও পালানো দরকার। যদি আমরা বন্ধনীগুলি সঠিকভাবে পালাতে পারি তবে কমপক্ষে আমাদের বন্ধনীগুলির মধ্যে হাইফেন -
এবং ক্যারেটটি নিয়ে বিরক্ত ^
করার দরকার নেই। এবং আমরা কোন চলে যাবে %
এবং_
বন্ধনীর হাত থেকে রক্ষা পেয়েছি অক্ষরগুলি রক্ষা করতে পারি, কারণ আমরা বন্ধনীগুলির বিশেষ অর্থ অক্ষম করব।
বন্ধনীগুলির জোড়া মেলানো সন্ধান করা এত কঠিন হওয়া উচিত নয়। সিঙ্গলটন% এবং _ এর সংঘটনগুলি পরিচালনা করার চেয়ে কিছুটা বেশি কঠিন। (দ্রষ্টব্য যে কেবল বন্ধনীর সমস্ত ঘটনা থেকে রেহাই যথেষ্ট নয়, কারণ একটি সিঙ্গলটন বন্ধনীকে আক্ষরিক হিসাবে বিবেচনা করা হয় এবং এড়াতে হবে না more আরও পরীক্ষার কেস না চালিয়ে আমি হ্যান্ডেল করার চেয়ে যুক্তিটি কিছুটা ঝাপসা হয়ে উঠছে more ।)
ইনলাইন এক্সপ্রেশন অগোছালো হয়ে যায়
এসকিউএল-তে এই ইনলাইন এক্সপ্রেশনটি দীর্ঘতর এবং কৃপণ হয়ে উঠছে। আমরা সম্ভবত এটি কার্যকর করে তুলতে পারি, তবে স্বর্গ যে দরিদ্র আত্মাকে পিছনে আসে এবং তা বোঝাতে হয় help আমি যতটা অনুরাগী ইনলাইন এক্সপ্রেশনগুলির জন্য আছি, আমি এখানে একটি ব্যবহার করার প্রবণতা করি না, মূলত কারণ আমি গণ্ডগোলের কারণ ব্যাখ্যা করে কোনও মন্তব্য দিতে চাই না এবং এর জন্য ক্ষমা চাইছি।
কোন অনুষ্ঠান কোথায়?
ঠিক আছে, সুতরাং, যদি আমরা এসকিউএল-তে কোনও ইনলাইন এক্সপ্রেশন হিসাবে এটি পরিচালনা না করি তবে আমাদের কাছে নিকটতম বিকল্পটি একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন। এবং আমরা জানি যে জিনিসগুলি কোনও গতি বাড়িয়ে তুলবে না (যদি না আমরা এর উপরে কোনও সূচকটি সংজ্ঞায়িত করতে পারি না, যেমন আমরা ওরাকলকে দিয়ে করতে পারি)) যদি আমাদের কোনও ফাংশন তৈরি করতে পাওয়া যায়, তবে এসকিউএলকে কল করার কোডটিতে আমরা এটি আরও ভাল করতে পারি might বিবৃতি।
এবং এই ফাংশনটির আচরণে কিছু পার্থক্য থাকতে পারে, যা ডিবিএমএস এবং সংস্করণে নির্ভর করে। (আপনার সকল জাভা বিকাশকারীকে চিৎকার করে আওয়াজ দেওয়া যায় যে আন্তঃদেশীয়ভাবে কোনও ডাটাবেস ইঞ্জিন ব্যবহার করতে সক্ষম হতে আগ্রহী))
ডোমেইন সংক্রান্ত জ্ঞান
কলামের জন্য আমাদের ডোমেনটির বিশেষ জ্ঞান থাকতে পারে, (এটি কলামের জন্য প্রয়োগযোগ্য অনুমতিযোগ্য মানের সেট। আমরা একটি অগ্রাধিকার জানতে পারি যে কলামে সঞ্চিত মানগুলি কখনই শতকরা চিহ্ন, আন্ডারস্কোর বা বন্ধনী ধারণ করে না এই ক্ষেত্রে, আমরা কেবলমাত্র একটি দ্রুত মন্তব্য অন্তর্ভুক্ত করব যে cases কেসগুলি আচ্ছাদিত।
কলামে সঞ্চিত মানগুলি% বা _ অক্ষরের জন্য মঞ্জুরি দিতে পারে, তবে একটি সীমাবদ্ধতার জন্য সেই মানগুলি পলায়ন করা প্রয়োজন, সম্ভবত একটি সংজ্ঞায়িত অক্ষর ব্যবহার করা যেতে পারে, যেমন মানগুলি তুলনা "নিরাপদ"। আবার মানগুলির অনুমোদিত সেট সম্পর্কে একটি তাত্পর্যপূর্ণ মন্তব্য এবং বিশেষত কোন চরিত্রটি একটি পালানোর চরিত্র হিসাবে ব্যবহৃত হয় এবং জোয়েল স্পলস্কির পদ্ধতির সাথে চলে।
তবে বিশেষায়িত জ্ঞান এবং গ্যারান্টি থেকে অনুপস্থিত, আমাদের পক্ষে কমপক্ষে সেই অস্পষ্ট কোণার কেসগুলি পরিচালনা করার বিষয়ে বিবেচনা করা এবং আচরণটি যুক্তিসঙ্গত এবং "স্পেসিফিকেশন অনুসারে" কিনা তা বিবেচনা করা গুরুত্বপূর্ণ।
অন্যান্য ইস্যু পুনরুক্ত
আমি বিশ্বাস করি অন্যরা ইতিমধ্যে বিবেচিত অন্যান্য সাধারণ ক্ষেত্রগুলির মধ্যে ইতিমধ্যে যথেষ্ট পরিমাণে নির্দেশ করেছে:
এসকিউএল ইঞ্জেকশন (ব্যবহারকারীর সরবরাহিত তথ্য হিসাবে যা প্রদর্শিত হবে তা গ্রহণ করে এবং এসকিউএল পাঠ্যটিতে বাইন্ড ভেরিয়েবলের মাধ্যমে সরবরাহের পরিবর্তে এটি অন্তর্ভুক্ত করে। এটি মোকাবেলার উপায়:
ইন্ডেক্স সেকেন্ডের চেয়ে সূচক স্ক্যান ব্যবহার করে অপ্টিমাইজার পরিকল্পনা, ওয়াইল্ডকার্ডগুলি থেকে বাঁচার জন্য একটি এক্সপ্রেশন বা ফাংশনের সম্ভাব্য প্রয়োজন (এক্সপ্রেশন বা ফাংশনের উপর সম্ভাব্য সূচি)
বাইন্ড ভেরিয়েবলের প্রভাবের পরিমাণের ক্ষেত্রে আক্ষরিক মানগুলি ব্যবহার করা যায় ala
উপসংহার
আমি জোয়েল স্পলস্কির অ্যাপ্রোচ পছন্দ করি। এটা চালাক। এবং এটি কাজ করে।
তবে আমি এটি দেখার সাথে সাথে সাথে সাথে এটির সাথে একটি সম্ভাব্য সমস্যাটি দেখেছি এবং এটিকে পিছলে যাওয়া আমার স্বভাব নয়। আমি অন্যের প্রচেষ্টার সমালোচনা করা বলতে চাই না। আমি জানি অনেক বিকাশকারী তাদের ব্যক্তিগত কাজ খুব ব্যক্তিগতভাবে গ্রহণ করে, কারণ তারা এতে এত বেশি বিনিয়োগ করে এবং তারা এ সম্পর্কে অনেক যত্ন করে। সুতরাং দয়া করে বুঝতে পারেন, এটি কোনও ব্যক্তিগত আক্রমণ নয়। আমি এখানে যা শনাক্ত করছি তা হ'ল ধরণের সমস্যা যা পরীক্ষার পরিবর্তে উত্পাদন হয়।
হ্যাঁ, আমি আসল প্রশ্ন থেকে অনেক দূরে চলে এসেছি। তবে আমি যে প্রশ্নের জন্য "নির্বাচিত" উত্তর দিয়ে একটি গুরুত্বপূর্ণ বিষয় হিসাবে বিবেচনা করি সে সম্পর্কে এই নোটটি কোথায় রাখবেন?