ما هو الغرض من استخدام المكان 1 = 1 في بيانات SQL؟ [مكرر

StackOverflow https://stackoverflow.com/questions/1264681

سؤال

التكرارات المحتملة:
لماذا سيكون استعلام SQL "حيث 1 = 1"
لماذا يستخدم شخص ما عند 1 = 1 وu003Cconditions> في جملة SQL؟

لقد رأيت ذلك كثيرا في أمثلة الاستعلام المختلفة ويمرها جميع محركات SQL.

إذا كان هناك استعلام لا يحتوي على أي شروط محددة للأشخاص (وخاصة أطر أورم) في كثير من الأحيان إضافة شرط حقيقي دائما WHERE 1 = 1 أو شيء من هذا القبيل.

لذلك بدلا من

SELECT id, name FROM users;

هم يستخدمون

SELECT id, name FROM users WHERE 1 = 1;

السبب الوحيد المحتمل الذي يمكنني التفكير فيه إذا كنت تضيف ظروفا ديناميكيا، لا دام للقلق بشأن تجريد الأولي AND ولكن لا يزال في كثير من الأحيان هذا 1 = 1 يتم تجريد الشرط إذا كان هناك شرط حقيقي في الاستعلام.

المثال الفعلي من CakePhp (الناتج عن طريق الإطار):

(لا شروط)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC;

(بشرط)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;

هل هناك أي سبب لإضافة هذه الحالة الإضافية؟

هل كانت مفيدة؟

المحلول

نعم، عادة ما يكون ذلك لأنه يبدأ "حيث 1 = 0"، لفرض البيان للفشل.

إنها طريقة أكثر ساذجة لفونها في معاملة وعدم ارتكابها في النهاية، لاختبار استفسارك. (هذا هو الأسلوب المفضل).

نصائح أخرى

إنها أيضا ممارسة شائعة عندما يكون الناس بناء استعلام SQL برمجيا, ، من الأسهل البدء ب "حيث 1 = 1" ثم إلحاق "وعميل العملاء .ID =: custid" اعتمادا إذا تم توفير معرف العميل. لذلك يمكنك دائما إلحاق الجزء التالي من الاستعلام بدءا من "و ...".

ال 1=1 يتم تجاهلها دائما جميع RDBMS. لا يوجد مفاضلة تنفيذ استفسار حيث 1 = 1.

بناء ديناميكية حيث الظروف، مثل أطر orm أو غيرها في كثير من الأحيان، فمن الأسهل إلحاق حقيقة حيث الظروف لأنك تتجنب التحقق من لإعداد و للحالة الحالية.

stmt += "WHERE 1=1";
if (v != null) {
   stmt += (" AND col = " + v.ToString());
}

هذه هي الطريقة التي تبدو بدونها بدون 1 = 1.

var firstCondition = true;
...
if (v != null) {
   if (!firstCondition) {
      stmt += " AND ";
   }
   else {
       stmt += " WHERE ";
       firstCondition = false;
   }
   stmt += "col = " + v.ToString());
}

يستخدمها الأشخاص لأنهم كسول بطبيعتهم عند بناء استفسارات SQL الديناميكية. إذا بدأت مع "where 1 = 1" ثم كل ما تبذلونه من بنودك الإضافية تبدأ فقط "and" وليس لديك لمعرفة ذلك.

ليس هناك أي شيء خاطئ في كونه كسول بطبيعته. لقد رأيت قوائم مرتبطة مضاعفة حيث تتكون قائمة "فارغة" من عقدين سنتين وتبدأ في المعالجة في first->next حتى last->prev شامل.

هذا إزالته فعلا جميع التعليمات البرمجية الخاصة للحذف first و last العقد. في هذا الإعداد، كل كانت العقدة عقدة الوسطية لأنك لم تتمكن من حذف first أو last. وبعد تم إهدار العقدتين ولكن الرمز كان أكثر بساطة و (قليلا) بشكل أسرع.

المكان الآخر الوحيد الذي شاهدته على الإطلاق "1 = 1" في بيرت. غالبا ما تستخدم التقارير المعلمات الموضعية وتعديلها مع JavaScript للسماح بجميع القيم. لذلك الاستعلام:

select * from tbl where col = ?

عندما يختار المستخدم "*" للمعلمة المستخدمة ل col تم تعديله لقراءة:

select * from tbl where ((col = ?) or (1 = 1))

يسمح هذا بالاستعلام الجديد الذي سيتم استخدامه دون هراء حول تفاصيل المعلمة الموضعية. لا يزال هناك بالضبط واحد هذه المعلمة. سيؤدي أي dbms لائقة (على سبيل المثال، db2 / z) إلى تحسين هذا الاستعلام لإزالة الفقرة بشكل أساسي قبل محاولة إنشاء خطة التنفيذ، لذلك لا يوجد مقايضة.

باستخدام 1 = 1 في الواقع ليست فكرة جيدة جدا لأن هذا يمكن أن يسبب عمليات تفحص الجدول الكامل بحد ذاتها.

انظر هذا -> T-SQL 1 = 1 أداء ضرب

كما قلت:

إذا كنت تضيف ظروفا ديناميكيا، فلا داعي للقلق بشأن تجريد الأولي وهذا هو السبب الوحيد، فأنت على حق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top