কেন কেউ এসকিউএল ধারাটিতে যেখানে 1 = 1 এবং <শর্তাদি> ব্যবহার করবেন?


256

কেন কেউ WHERE 1=1 AND <conditions>এসকিউএল ক্লজে ব্যবহার করবেন (হয় এসকিউএলকে সংক্ষিপ্ত স্ট্রিংয়ের মাধ্যমে প্রাপ্ত করা হয়, হয় সংজ্ঞা দেখুন)

আমি কোথাও দেখেছি যে এটি এসকিউএল ইনজেকশন থেকে রক্ষা করতে ব্যবহৃত হবে তবে এটি অত্যন্ত অদ্ভুত বলে মনে হচ্ছে।

ইনজেকশন থাকলে WHERE 1 = 1 AND injected OR 1=1একই ফলাফল হবে injected OR 1=1

পরবর্তী সম্পাদনা: দর্শন সংজ্ঞাতে ব্যবহার সম্পর্কে কী?


আপনার উত্তরের জন্য ধন্যবাদ।

তবুও, আমি বুঝতে পারি না কেন কেউ এই নির্মাণকে কোনও দৃষ্টিভঙ্গি সংজ্ঞায়িত করার জন্য ব্যবহার করবে বা এটি একটি সঞ্চিত পদ্ধতিতে ব্যবহার করবে।

উদাহরণস্বরূপ এটি নিন:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value

3
"কেন কেউ এই দৃষ্টিভঙ্গি সংজ্ঞায়িত করার জন্য এই নির্মাণ ব্যবহার করবেন" সম্ভবত অভ্যাসের বাইরে। এটি স্থিত প্রশ্নের ক্ষেত্রে কোনও কার্যকরী সুবিধা দেয় না।
এডিটিসি

উত্তর:


346

অবস্থার তালিকাটি যদি সংকলন সময়ে জানা না যায় এবং পরিবর্তে রান সময়ে নির্মিত হয়, আপনার এক বা একাধিক শর্ত রয়েছে কিনা তা নিয়ে আপনাকে চিন্তার দরকার নেই। আপনি এগুলি সমস্ত তৈরি করতে পারেন:

and <condition>

এবং তাদের একসাথে একত্রিত। সঙ্গে 1=1শুরুতে, প্রাথমিক andসাথে আপনাকে সংশ্লিষ্ট করতে কিছু আছে।

আমি কখনই কোনও ইনজেকশন সুরক্ষার জন্য এটি ব্যবহার করে দেখিনি, কারণ আপনি বলেছেন যে এটি তেমন সাহায্য করবে বলে মনে হয় না। আমি করেছি দেখা এটা একটি বাস্তবায়ন সুবিধার জন্য ব্যবহার করা হয়েছে। এসকিউএল কোয়েরি ইঞ্জিনটি উপেক্ষা করে শেষ হবে 1=1যাতে এর কোনও কার্যকারিতা প্রভাব না পড়ে।


34
কখনও কখনও অলস হওয়া সম্পর্কে নয়, তবে একটি ক্লিনার কোড রয়েছে।
এডুয়ার্ডো মোল্টেনি

39
অ্যান্ডস বা সিএমএএমএস অনুসরণ করার বিষয়টি ময়লা নয় ... আপনার এসকিউএল জুড়ে 1 = 1 রেখে কিছুই পরিষ্কার হয় না।

21
DBAs? কি জন্য তারা? :)
এডুয়ার্ডো মোল্টেনি

38
ডিবিএ রয়েছে প্রোগ্রামারদের পরে পরিষ্কার করার জন্য যারা মনে করেন যে তারা কীভাবে কার্যকরভাবে ডাটাবেসগুলি ব্যবহার করতে জানেন।
অ্যাড্রিয়ান প্রানক

23
"অলস" আমি মনে করি এটি স্মার্ট, অলস নয়। আপনি পুনরাবৃত্তিমূলক কোড এবং অপ্রয়োজনীয় অবস্থার চেকগুলি এড়িয়ে চলেছেন। where 1=1(ওরাকল) বা where true(পোস্টগ্র্রেস) যোগ করতে সক্ষম না হয়ে , আমাকে প্রতিটি শর্তটি প্রথমটি কিনা তা যাচাই করতে হবে। এটি করার কোনও অর্থ নেই এবং এটি কেবলমাত্র আরও বয়লারপ্লেট কোড যুক্ত করে।
এডিটিসি

113

গ্রেগের উত্তরে কেবল একটি উদাহরণ কোড যুক্ত করুন:

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if

6
বিট হ্যাকি, তবে এটি একটি কার্যকর ব্যবহারের মতো বলে মনে হচ্ছে।
মাইক

5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অনুশীলনটি সত্যই কেবলমাত্র আপনার কতটি শর্তসাপেক্ষ রয়েছে তা নির্ধারণ না করেই হ্যাক।
অগ্লাসম্যান

38

কন্ডিশনের সংখ্যা পরিবর্তনশীল হতে পারে তখন আমি এটি ব্যবহার করে দেখেছি।

আপনি "ও" স্ট্রিং ব্যবহার করে শর্তগুলি সঞ্চার করতে পারেন। তারপরে, আপনি যে কন্ডিশনে যাচ্ছেন তার সংখ্যা গণনা করার পরিবর্তে আপনি আপনার স্টক এসকিউএল স্টেটমেন্টের শেষে একটি "WHERE 1 = 1" রাখুন এবং সংযুক্ত শর্তগুলিতে ফেলে দিন।

মূলত, এটি আপনাকে শর্তগুলির জন্য একটি পরীক্ষা করতে বাঁচায় এবং তারপরে একটি "WHERE" স্ট্রিং যুক্ত করুন।


28

সর্বদা এটি জানার জন্য একটি অলস উপায় বলে মনে হয় যে আপনার WHERE ধারাটি ইতিমধ্যে সংজ্ঞায়িত হয়েছে এবং এটি আপনাকে প্রথমটি কিনা তা পরীক্ষা না করে শর্ত যুক্ত করার অনুমতি দেয়।


12
"অলস" আমি মনে করি এটি স্মার্ট, অলস নয়। আপনি পুনরাবৃত্তিমূলক কোড এবং অপ্রয়োজনীয় অবস্থার চেকগুলি এড়িয়ে চলেছেন। where 1=1(ওরাকল) বা where true(পোস্টগ্র্রেস) যোগ করতে সক্ষম না হয়ে , আমাকে প্রতিটি শর্তটি প্রথমটি কিনা তা যাচাই করতে হবে। এটি করার কোনও অর্থ নেই এবং এটি কেবলমাত্র আরও বয়লারপ্লেট কোড যুক্ত করে।
এডিটিসি

2
@ এডটিসি রাইটিং কোডটি প্রায়শই হয় - তবে বেশিরভাগ ক্ষেত্রেই না - বিভিন্ন শর্ত পরিচালনার বিষয়ে। এটি হ'ল আর একটি শর্ত যা পরিচালনা করা দরকার, যা আমি ব্যক্তিগতভাবে মনে করি যে উত্পাদিত এসকিউএলকে দূষিত করতে অলস। আপনি যদি কোনও স্থানে 'কোথাও 1 = 1' যুক্ত করতে আপনার কোডটি আর্কিটেক্ট করেন তবে আপনি - সামান্য অতিরিক্ত প্রচেষ্টা দিয়ে - আপনার কোডের এক জায়গায় শূন্য এবং অনেক শর্তের মধ্যে পার্থক্য পরিচালনা করতে পারেন। যদিও আমার অনুমান, 'কোথাও 1 = 1' এর পক্ষে এটি তাদের কোডবেজ জুড়ে ছিটান, যা আমাকে উপসংহারে পৌঁছে দেয় অলসতার অলসতা।
জেসন এস

@ জেসনস অলসতা আবিষ্কারের জনক।
এডিটিসি

@ এডটিসি আমি অলস কারণ আমি কয়েকশ জায়গায় কোড আপডেট করতে পছন্দ করি না, তাই আবিষ্কারটি এটি একটি জায়গায় স্থাপন করা হয়েছে। আমার কাছে WHERE 1=1একাধিক স্থানে একই কোড বজায় রাখার এবং আপনার উত্পন্ন সমস্ত এসকিউএল এ পড়ার অতিরিক্ত কাজের প্রজনন করে। আমি আপনার চেয়ে বেশি অলস!
জেসন এস

19

অপ্রত্যক্ষভাবে প্রাসঙ্গিক: যখন 1 = 2 ব্যবহৃত হয়:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

এটি পুরানো টেবিলের মতো একই স্কিমা সহ একটি নতুন টেবিল তৈরি করবে। (আপনি যদি তুলনার জন্য কিছু ডেটা লোড করতে চান তবে খুব সহজ)


3
যোগ করতে ভুলে গেছেন, যদিও এটি পুরানো হিসাবে একই ডেটা সহ একটি নতুন টেবিল তৈরি করবে, নতুন টেবিলটিতে পুরানো টেবিল থেকে বিদেশী কী-র মতো অন্যান্য প্রতিবন্ধকতা থাকবে না
মিলসো

16

1 = 1 এক্সপ্রেশনটি সাধারণত উত্পন্ন স্কেল কোডে ব্যবহৃত হয়। এই অভিব্যক্তিটি শর্তাধীন বিবৃতিগুলির সংখ্যা হ্রাস করার জন্য বর্গফুট উত্পন্ন কোড সহজ করতে পারে।


11

আসলে, আমি বিআইআরটি রিপোর্টে এই ধরণের জিনিস ব্যবহার করেছি। বিআইআরটি রানটাইমে পাস করা ক্যোয়ারীটি ফর্মটির:

select a,b,c from t where a = ?

এবং '?' একটি ড্রপ ডাউন বাক্স থেকে নির্বাচিত একটি প্রকৃত প্যারামিটার মান দ্বারা রানটাইম এ প্রতিস্থাপন করা হয়। ড্রপ-ডাউন-এ পছন্দগুলি দেওয়া হয়েছে:

select distinct a from t
union all
select '*' from sysibm.sysdummy1

যাতে আপনি সমস্ত সম্ভাব্য মান প্লাস " *" পান। যদি ব্যবহারকারী *ড্রপ ডাউন বাক্স থেকে " " নির্বাচন করে (যার অর্থ একটি এর সমস্ত মান নির্বাচন করা উচিত), ক্যোয়ারী চালানোর আগে (জাভাস্ক্রিপ্ট দ্বারা) পরিবর্তন করতে হবে।

যেহেতু "?" একটি অবস্থানগত প্যারামিটার এবং অন্যান্য জিনিস কাজ করার জন্য সেখানে থাকতে হবে, জাভাস্ক্রিপ্টটি ক্যোয়ারীটি হতে পরিবর্তন করে:

select a,b,c from t where ((a = ?) or (1==1))

এটি মূলত অবস্থানগত প্যারামিটারটিকে স্থানে রেখে যখন ক্লজটির প্রভাবটি সরিয়ে দেয়।

গতিশীলভাবে একটি এসকিউএল কোয়েরি তৈরি করার সময় অলস কোডারদের দ্বারা ব্যবহৃত এ্যান্ড কেসটিও আমি দেখেছি।

বলুন আপনাকে গতিশীলভাবে এমন কোয়েরি তৈরি করতে হবে যা দিয়ে শুরু হয় select * from tএবং চেক করে:

  • নাম বব; এবং
  • বেতন> 20,000 ডলার হয়

কিছু লোক প্রথমে একটি WHERE এবং এর সাথে পরবর্তীগুলির সাথে একটি এবং এর সাথে যোগ করবে:

select * from t where name = 'Bob' and salary > 20000

অলস প্রোগ্রামারস (এবং এটি অগত্যা নয় খারাপ বৈশিষ্ট্যও নয়) যুক্ত হওয়া শর্তগুলির মধ্যে পার্থক্য করতে পারে না, তারা শুরু করে select * from t where 1=1কেবল তারপরে এবং ক্লজ যুক্ত করবে।

select * from t where 1=1 and name = 'Bob' and salary > 20000

1
"অলস" আমি মনে করি এটি স্মার্ট, অলস নয়। আপনি পুনরাবৃত্তিমূলক কোড এবং অপ্রয়োজনীয় অবস্থার চেকগুলি এড়িয়ে চলেছেন। where 1=1(ওরাকল) বা where true(পোস্টগ্র্রেস) যোগ করতে সক্ষম না হয়ে , আমাকে প্রতিটি শর্তটি প্রথমটি কিনা তা যাচাই করতে হবে। এটি করার কোনও অর্থ নেই এবং এটি কেবলমাত্র আরও বয়লারপ্লেট কোড যুক্ত করে।
এডিটিসি

1
@ এডটিসি, আমি খারাপ উপায়ে অলসতা বোঝাতে চাইনি। আসলে, অলস প্রোগ্রামিংয়ে একটি ভাল বৈশিষ্ট্য :-) আমি স্পষ্ট করব।
প্যাক্সডিয়াবলো

অলসতা সমস্ত অশুভের মূল
Ivanzinho

11

আমি যখন এই ডাটাবেজে জিনিসগুলি পরীক্ষা বা ডাবল চেক করছি তখন আমি এই প্যাটার্নটি পুরোপুরি কার্যকর দেখতে পেয়েছি, তাই আমি অন্যান্য শর্তে খুব দ্রুত মন্তব্য করতে পারি:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
AND Table.Field=Value
AND Table.IsValid=true

এতে পরিণত হয়:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
--AND Table.Field=Value
--AND Table.IsValid=true

10

যেখানে 1 = 0, টেবিলটি বিদ্যমান আছে কিনা তা পরীক্ষা করতে এটি করা হয়। কেন 1 = 1 ব্যবহার করা হয় তা জানেন না।


1
নতুন রেকর্ডগুলির জন্য ধারক হিসাবে ব্যবহার করার জন্য এটি ডাটাবেস থেকে একটি খালি ফলাফলসেটটি ফেরত দেওয়ার জন্য ব্যবহৃত এটি দেখে।
গ্যারি কিন্ডেল

6

আমি দেখতে পাচ্ছি যে 1 = 1 জেনারেটেড এসকিউএল এর জন্য কার্যকর হবে, আমি পিএইচপি-তে যে কৌশলটি ব্যবহার করি তা হ'ল ধারাগুলির অ্যারে তৈরি করা এবং তারপরে

implode (" AND ", $clauses);

এইভাবে একটি শীর্ষস্থানীয় বা পিছনে থাকা সমস্যা এড়ানো। স্পষ্টতই এটি কেবল তখনই কার্যকর যদি আপনি জানেন যে আপনার কমপক্ষে একটি ধারা রয়েছে!


1
সেখানেই 1 = 1 আসে It এটি আপনাকে দেয় যে "কমপক্ষে একটি ধারা" যাতে আপনাকে কেবল "" অ্যাডাব্লু "উপর চড় মারার বিষয়ে চিন্তা করতে হবে না
কার্ল

আমি এই ধারনাটি পছন্দ করি! এখানে আরো সম্পূর্ণ উদাহরণস্বরূপ দেখুন stackoverflow.com/questions/35326160/...
drooh

5

এখানে একটি নিবিড়ভাবে সম্পর্কিত উদাহরণ: একটি এসকিউএল ব্যবহার করে MERGE উত্স টেবিলের সমস্ত মান ব্যবহার করে লক্ষ্য সারণি আপডেট করার জন্য বিবৃতি ব্যবহার করা যেখানে কোনও সাধারণ বৈশিষ্ট্য নেই যেখানে উদাহরণস্বরূপ যোগদান করতে হবে

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;

5

কেন কেউ যেখানে 1 = 1 এবং ব্যবহার করবেন <proper conditions>

আমি করেছি দেখা দেশী অবকাঠামো এই (ভালো জিনিস না গোলাপী আভা ), হিসাবে এই অনুমতি দেয় অলস পার্সিং চর্চা উভয় প্রয়োগ করা WHEREএবংAND এসকিএল কীওয়ার্ড ।

উদাহরণস্বরূপ (আমি এখানে উদাহরণ হিসাবে সি # ব্যবহার করছি), সিক্যুয়াল কোয়েরিতে নিম্নলিখিত পূর্বাভাসগুলির শর্তসাপেক্ষ পার্সিং বিবেচনা করুন string builder:

var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1"
if (shouldFilterForBars)
{
    sqlQuery = sqlQuery + " AND Bars > 3";
}
if (shouldFilterForBaz)
{
    sqlQuery = sqlQuery + " AND Baz < 12";
}

"সুবিধা" এর WHERE 1 = 1অর্থ হল যে কোনও বিশেষ কোডের প্রয়োজন নেই:

  • জন্য এবং - কিনা শূন্য, এক বা উভয় predicates (বার ও বায এর), প্রয়োগ করতে হবে তা নির্ধারণ হবে যা প্রথম কিনা ANDপ্রয়োজন। যেহেতু আমাদের ইতিমধ্যে কমপক্ষে একটি ভবিষ্যদ্বাণী করেছে 1 = 1, এর অর্থAND সর্বদা ঠিক।
  • কোনও পূর্বাভাস দেওয়ার জন্য না - জেরো যেখানে পূর্বাভাস দেয় সেখানে WHEREঅবশ্যই তা বাদ দিতে হবে। তবে আবার, আমরা অলস হতে পারি, কারণ আমরা আবার কমপক্ষে একটি শিকারীর গ্যারান্টিযুক্ত।

এটি অবশ্যই একটি খারাপ ধারণা এবং এইভাবে thisচ্ছিক এবং শর্তসাপেক্ষ পূর্বাভাসগুলি পার্স করার জন্য একটি প্রতিষ্ঠিত ডেটা অ্যাক্সেস ফ্রেমওয়ার্ক বা ওআরএম ব্যবহার করার পরামর্শ দিবে ।


অথবা যদি আপনার নিজস্ব ঘূর্ণায়মান হয় তবে ক্লোজ বিল্ডারটি আপনার কোডের এক জায়গায় থাকতে হবে। তারপরে আপনি শূন্যের পূর্বাভাসগুলি বা আপনার কোডের একক স্থানে শূন্যের পূর্বাভাসগুলি পরিচালনা করতে পারেন। আমার সন্দেহ হ'ল এর অস্তিত্বই WHERE 1=1ন্যায্য সূচক যে ঘটনাটি নয়, কোড কোডটি স্ট্রিংয়ের বিট দ্বারা বিভক্ত WHERE 1=1, যা আমার কাছে একটি অ্যাপ্লিকেশন আর্কিটেকচার সমস্যাটি ইঙ্গিত করবে এবং আমি অনুমান করব যে এটি কেবলমাত্র একটিই নয়!
জেসন এস

1
আসলে ধারণা সম্পর্কে "খারাপ" কিছুই নেই, একটি "সুস্পষ্ট" ত্রুটি কম। বা কোনও ক্ষেত্রেই কোনও ওআরএম যথাযথ উপায় নয়। এসকিউএল এবং রিলেশনাল বীজগণিত মানুষগুলি শিখুন ...
হেজাজমান

4

আপনি যদি এখানে অনুসন্ধান করতে এসেছেন WHERE 1তবে তা নোট করুন WHERE 1এবং WHERE 1=1অভিন্ন। WHERE 1খুব কমই ব্যবহার করা হয় কারণ কিছু ডেটাবেস সিস্টেম WHERE 1সত্যই বুলিয়ান না হয়ে বিবেচনা করে তা প্রত্যাখ্যান করে ।


2

এটি এমন ক্ষেত্রে কার্যকর যেখানে আপনাকে গতিশীল ক্যোয়ারী ব্যবহার করতে হবে যেখানে যেখানে আপনাকে কিছু ফিল্টার বিকল্প যুক্ত করতে হবে সেই ধারাটিতে। আপনি যদি স্ট্যাটাসের জন্য 0 টি বিকল্প নিষ্ক্রিয়, সক্রিয় করার জন্য 1 টি অন্তর্ভুক্ত করেন তবে Like বিকল্পগুলির উপর ভিত্তি করে, কেবল দুটি উপলভ্য বিকল্প রয়েছে (0 এবং 1) তবে আপনি যদি সমস্ত রেকর্ড প্রদর্শন করতে চান তবে যেখানে 1 = 1 টি নিকটবর্তী হয় তা অন্তর্ভুক্ত করা সহজ। নীচের নমুনা দেখুন:

Declare @SearchValue    varchar(8) 
Declare @SQLQuery varchar(max) = '
Select [FirstName]
    ,[LastName]
    ,[MiddleName]
    ,[BirthDate]
,Case
    when [Status] = 0 then ''Inactive''
    when [Status] = 1 then ''Active''
end as [Status]'

Declare @SearchOption nvarchar(100)
If (@SearchValue = 'Active')
Begin
    Set @SearchOption = ' Where a.[Status] = 1'
End

If (@SearchValue = 'Inactive')
Begin
    Set @SearchOption = ' Where a.[Status] = 0'
End

If (@SearchValue = 'All')
Begin
    Set @SearchOption = ' Where 1=1'
End

Set @SQLQuery = @SQLQuery + @SearchOption

Exec(@SQLQuery);

2

সমস্ত উত্তরগুলি পর্যালোচনা করে আমি কিছু পরীক্ষার মতো করার সিদ্ধান্ত নিয়েছি

SELECT
*
FROM MyTable

WHERE 1=1

তারপরে আমি অন্যান্য নম্বর দিয়ে পরীক্ষা করেছিলাম

WHERE 2=2
WHERE 10=10
WHERE 99=99

ect সমস্ত চেক সম্পন্ন করার পরে, ক্যোয়ারী রান টাউনটি একই। এমনকি যেখানে দফা ছাড়া। আমি সিনট্যাক্সের ভক্ত নই


1

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

কিছুটা এইরকম

select column1, column2 from my table where 1=1 {name} {age};

তারপরে আমরা যেখানে ক্লজটি এর মতো তৈরি করব এবং এটি প্যারামিটারের মান হিসাবে পাস করব

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

যেহেতু রানটাইমের সময় যেখানে ক্লজ নির্বাচনটি আমাদের অজানা, তাই এটি কোনওটি অন্তর্ভুক্ত করা যায় কিনা তা সন্ধানে আমাদের একটি দুর্দান্ত চুক্তিতে সহায়তা করে 'AND' or 'WHERE'.


0

একটি প্রিকেট লাইক ব্যবহার 1=1করা একটি সাধারণ ইঙ্গিত যা কখনও কখনও অ্যাক্সেস প্ল্যানকে ইনডেক্স স্ক্যান ব্যবহার করতে বা ব্যবহার করতে বাধ্য করতে ব্যবহৃত হয়। এই কারণটি ব্যবহার করার কারণ হ'ল আপনি যখন একাধিক পূর্বাভাস সহ একাধিক-নেস্টেড যোগদানের ক্যোয়ারী ব্যবহার করছেন যেখানে এমন ধারা যেখানে মাঝে মাঝে এমনকি সমস্ত সূচী ব্যবহার করে প্রতিটি টেবিল পড়ার অ্যাক্সেস পরিকল্পনা তৈরি করে - একটি পূর্ণ টেবিল স্ক্যান। একটি ডিবিএমএসকে আরও দক্ষ পাথ ব্যবহার করতে চালিত করতে ডিবিএ দ্বারা ব্যবহৃত বহু ইঙ্গিতগুলির মধ্যে এটি কেবল 1। শুধু একটি ভিতরে ফেলবেন না; কোয়েরিটি সর্বদা কার্যকর হয় না বলে বিশ্লেষণ করতে আপনার একটি ডিবিএ দরকার।


4
আপনার কাছে এমন কোনও উদ্ধৃতি রয়েছে যা কিছু ডাটাবেসের জন্য এই আচরণটি নথিভুক্ত করে?
জো

0

এখানে একটি ব্যবহারের কেস রয়েছে ... তবে আমি কেন 1 = 1 ব্যবহার করতে হবে বা করব না তার প্রযুক্তিগততার সাথে আমি খুব বেশি উদ্বিগ্ন নই I আমি এসকিউএল সার্ভার থেকে কিছু তথ্য উদ্ধার করার জন্য পাইডবিসি ব্যবহার করে একটি ফাংশন লিখছি। আমি whereআমার কোডে কীওয়ার্ডের পরে ফিলারকে জোর করার কোনও উপায় খুঁজছিলাম । এটি সত্যই একটি দুর্দান্ত পরামর্শ ছিল:

if _where == '': _where = '1=1'
...
...
...
cur.execute(f'select {predicate} from {table_name} where {_where}')

কারণটি হ'ল কারণ আমি কোথাও ক্লিয়ার ভেরিয়েবলের ভিতরে 'যেখানে' কীওয়ার্ডটি প্রয়োগ করতে পারিনি inside সুতরাং, আমি মনে করি যে কোনও ডামি শর্ত যা সত্যের সাথে মূল্যায়ন করে তা ফিলার হিসাবে করতে পারে।


-1

আমি প্রথম এডিও এবং ক্লাসিক এসপ দিয়ে ফিরে এসেছি, আমার যে উত্তরটি পেয়েছিল তা হ'ল: পারফরম্যান্স। আপনি যদি একটি সোজা কাজ

Select * from tablename

এবং এটি একটি এসকিএল কমান্ড / পাঠ্য হিসাবে পাস করুন আপনি এর সাথে একটি লক্ষণীয় পারফরম্যান্স বৃদ্ধি পাবেন

Where 1=1

যোগ করা হয়েছে, এটি একটি দৃশ্যমান পার্থক্য ছিল। প্রথম শর্তটি পূরণ হওয়ার সাথে সাথে টেবিল শিরোনামগুলি ফেরত দেওয়ার সাথে কিছু করার, বা অন্য কোনও ক্রেজি, যাইহোক, এটি গতি বাড়িয়ে তোলে।


3
যদি এটি সত্য হয় তবে ডিবিএমএস সর্বদা এটি যুক্ত করে না কেন?
কারকামানো

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