سؤال

هناك سؤال عائم. تم تعيينه بشروط SQL الأساسية ، لكن طبيعتها هي الرياضيات الخالصة (لذلك ربما يجب أن أزور http://mathoverflow.com جدا).

لدي جدول في بعض قاعدة البيانات النظرية مع 6 حقول ، كلها أرقام. لدينا أيضًا شروط أساسية ، مثل Field_1> field_5 ، field_4 = 3 إلخ ، 7 شروط. أحتاج إلى كتابة مختار ، يرضي على الأقل 4 منهم.

كتابة loooooooooooooooooooooooooonong حدد مع العديد من الشروط المنطقية مثل (Cond_1 و cond_2 و cond_3 و cond_4) أو (...) ليست وسيلة ، لأن 4-combination من 7 عناصر تساوي 140 ، ولا يريد المرء كتابة الكثير من الشروط.

فكيف أكتب اختيار في شكله المبسط؟

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

المحلول

تتمثل إحدى طرق القيام بذلك في حساب 1 لكل حالة يرضي الصف ومقارنة المبلغ بالقيمة المستهدفة:

SELECT * 
FROM yourtable
WHERE (
          (CASE WHEN condition1 THEN 1 ELSE 0 END) +
          (CASE WHEN condition2 THEN 1 ELSE 0 END) +
          ...
          (CASE WHEN condition7 THEN 1 ELSE 0 END)
      ) >= 4

لاحظ أن هذا سيتطلب تقييم جميع الشروط لكل صف ، لذا لن تحصل على تأثير قصير للدائرة ، لكنه بسيط وربما يكون له أداء جيد بما يكفي لك.

إذا كنت تستخدم MySQL ، فيمكنك كتابة هذا بطريقة أبسط بكثير لأن النتيجة المنطقية تعادل 0 أو 1 حتى لا تحتاج إلى عبارات الحالة:

WHERE (condition1) + (condition2) + ... + (condition7) >= 4

نصائح أخرى

يمكنك ببساطة إضافة مجموع الظروف الحقيقية معًا ، لوس أنجلوس

CASE 
WHEN Field1 > Field5 THEN
    1
ELSE
    0
END
+
CASE
WHEN Field4 = 3 THEN
    1
ELSE
    0
END
+
etc
AS condition_sum

وتصفية على حالة inction_sum> Threshhold. يمكنك حتى وضع تفكيك تعبير مجموع الحالات في دالة لرمز أكثر قابلية للقراءة قليلاً.

أود أن أقترح ببساطة حساب عدد الشروط الراضية. سيعتمد بناء الجملة المعين على محرك إدارة قاعدة البيانات الذي تستخدمه ، ولكن في MySQL سيبدو مثل هذا:

SELECT things
FROM places
WHERE IF(cond_1, 1, 0) + IF(cond_2, 1, 0) + IF(cond_3, 1, 0) + IF(cond_4, 1, 0) + IF(cond_5, 1, 0) >= 4;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top