প্রস্তুত বিবৃতিতে "লাইক" ওয়াইল্ডকার্ড ব্যবহার করা


176

আমি মাইএসকিএল ডাটাবেস অনুসন্ধানগুলি কার্যকর করতে প্রস্তুত বিবৃতি ব্যবহার করছি। এবং আমি সাজানোর কীওয়ার্ডের উপর ভিত্তি করে একটি অনুসন্ধান কার্যকারিতা বাস্তবায়ন করতে চাই।

তার জন্য আমার LIKEকীওয়ার্ড ব্যবহার করা দরকার যা আমি জানি। এবং আমি এর আগেও প্রস্তুত বিবৃতি ব্যবহার করেছি, তবে আমি কীভাবে এটি ব্যবহার করব জানি না LIKEকারণ নীচের কোড থেকে আমি কোথায় যুক্ত করব 'keyword%'?

আমি সরাসরি এটা ব্যবহার করতে পারি pstmt.setString(1, notes)যেমন (1, notes+"%")বা ওই জাতীয় কিছু। আমি ওয়েবে এটিতে প্রচুর পোস্ট দেখতে পাচ্ছি কিন্তু কোথাও কোনও ভাল উত্তর নেই।

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

উত্তর:


281

আপনাকে এটিকে মানটিতে সেট করতে হবে, প্রস্তুত বিবৃতি এসকিউএল স্ট্রিংয়ে নয়।

সুতরাং, এটি একটি উপসর্গ-ম্যাচ জন্য করা উচিত:

notes = notes
    .replace("!", "!!")
    .replace("%", "!%")
    .replace("_", "!_")
    .replace("[", "![");
PreparedStatement pstmt = con.prepareStatement(
        "SELECT * FROM analysis WHERE notes LIKE ? ESCAPE '!'");
pstmt.setString(1, notes + "%");

বা প্রত্যয়-ম্যাচ:

pstmt.setString(1, "%" + notes);

বা বিশ্বব্যাপী ম্যাচ:

pstmt.setString(1, "%" + notes + "%");

18
+1 ওপেল এসকিউএলে এটি "সেট" করতে পারে - যেমন ... LIKE '%' || ? || '%'বা অনুরূপ - তবে এটি অনেক কম নমনীয়।
পাইলক্রো

আমি কীভাবে এটি নন-কেস সংবেদনশীল মোড দিয়ে করব? :)
আলফা গ্যাব্রিয়েল ভি। টিম্বল

2
অ-কেস-সংবেদনশীল এখনও ব্যবহারের WHERE UPPER(?) LIKE UPPER(?)সময় ব্যবহার করতে পারেনpstmt.setString(2, "%" + notes + "%")
জিগ

1
@ অ্যালাইন: আপনাকে ধন্যবাদ কেবল অবাক হচ্ছেন, বিশ্ব যে সমস্ত আরডিবিএমএস সম্পর্কে সচেতন তা কি এটি প্রয়োগ করে? সম্ভবত '%' || ? || '%'প্রথম মন্তব্যে উল্লেখ করা ভাল ছিল, সর্বোপরি? আমার এখনই পরীক্ষার সুযোগ নেই।
বালুসসি

2
@ বালাসসি এটি আমার পরীক্ষায় এমএসএসকিউএল, পোস্টগ্রিস এবং মাইএসকিউএল এর জন্য প্রযোজ্য। প্যারামিটারে তৈরি স্ট্রিংটি নিজেই ডেটা এবং নিয়ন্ত্রণ নির্দেশের মিশ্রণ হিসাবে ব্যাখ্যা করা হয়। এসকিউএল কনটেন্টেশনটি ব্যাখ্যা করার আগে এবং দুর্বলতা সংরক্ষণের আগে ঘটে। আইইইই সেন্টার ফর সিকিউর ডিজাইনটি কঠোরভাবে ডেটা এবং নিয়ন্ত্রণের নির্দেশাবলী পৃথক করে এবং অবিশ্বস্ত উত্স থেকে প্রাপ্ত নিয়ন্ত্রণ ব্যবস্থার নির্দেশাবলী কখনই প্রক্রিয়া করতে চায় না
আলাইন ও'ডিয়া

28

এটির মতো কোড করুন:

PreparedStatement pstmt = con.prepareStatement(
    "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes + "%");`

নিশ্চিত হয়ে নিন যে আপনি নীচে '' এর মতো কোটগুলি অন্তর্ভুক্ত করবেন না কারণ তারা ব্যতিক্রম ঘটায়।

pstmt.setString(1,"'%"+ notes + "%'");

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

5

আমরা সহজেই এটি করতে পারি, কনসেট এসকিউএল ফাংশনটি ব্যবহার করে।

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like CONCAT( '%',?,'%')";
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

এটি আমার ক্ষেত্রে পুরোপুরি কাজ করে work


4
PreparedStatement ps = cn.prepareStatement("Select * from Users where User_FirstName LIKE ?");
ps.setString(1, name + '%');

এটি চেষ্টা করে দেখুন।



-13
String query="select * from test1 where "+selected+" like '%"+SelectedStr+"%';";


PreparedStatement preparedStatement=con.prepareStatement(query);


// where seleced and SelectedStr are String Variables in my program

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