استعلام SQL - صحيح => صحيح، خطأ => صحيح أو خطأ
-
20-08-2019 - |
سؤال
استفسار بسيط، ربما مستحيل ولكن أعلم أن هناك بعض الأشخاص الأذكياء :)
نظرًا لمعلمة منطقية، أرغب في تحديد عبارة المكان الخاصة بي إما للحد من إخراج عمود معين - أو عدم القيام بأي شيء.
لذلك، بالنظر إلى المعلمة @bit = 1 ستكون هذه هي النتيجة:
حيث العمود = 1
المعلمة المعطاة @bit = 0 ستكون هذه هي النتيجة:
حيث العمود = 1 أو 0
أي.ليس له أي تأثير/إظهار كافة النتائج (العمود عبارة عن حقل صغير)
لا أريد SQL ديناميكيًا - يمكنني تسوية هذا الأمر في الكود ولكني تساءلت فقط عما إذا كان هناك بعض السحر الذكي الذي من شأنه أن يجعل ما ورد أعلاه أنيقًا وبسيطًا.
هل هناك؟أنا أستخدم خادم SQL.
هتاف :د
المحلول
ووcolumn = 1 or @bit = 0
الجواب يعمل إذا العمود قد يكون فقط 0 أو 1. إذا العمود قد يكون أي القيمة التي تريدها: column = 1 or @bit = 0 and column = 0
نصائح أخرى
SELECT *
FROM mytable
WHERE column = 1 OR @bit = 0
إذا كان لديك فهرس على column1
, ، سيكون هذا أكثر كفاءة:
SELECT *
FROM mytable
WHERE column = 1 AND @bit = 1
UNION ALL
SELECT *
FROM mytable
WHERE @bit = 0
راجع هذه المقالة في مدونتي لمقارنة أداء واحدة WHERE
الحالة مقابل UNION ALL
:
where column BETWEEN @bit AND 1
select *
from MyTable
where (@bit = 0 OR MyColumn = 1)
select ...
from [table]
where @bit = 0 or (column = @bit)
وكنت قد حان حتى مع إجابة مختلفة وشعرت البكم عند رؤية الإجابة الآراء. لذلك، لمجرد yucks، مقارنة اثنين باستخدام قاعدة البيانات الخاصة بي. أنا لا أعرف حقا إذا كانت قابلة للمقارنة حقا، ولكن خطط التنفيذ بلدي تعطي أفضلية طفيفة لجوابي أبله:
وحدد *
من MyTable
حيث العمود <> حالةbit عند 1 ثم 0 آخر -1 نهاية
وأنا أدرك المؤشرات، حجم الجدول، وما يمكن أن يؤثر هذا.
أيضا، أدرك أنك ربما لا يمكن مقارنة قليلا إلى -1 ...
بس كنت حصة.
وهذه محاولة
select ...
from table
where column = case when @bit = 0 then 0 else column end
وهذا يعمل بغض النظر عن نوع البيانات من العمود (يمكن حتى تكون سلسلة، على سبيل المثال). لو كانت، بطبيعة الحال، فإنه سيكون قيمة افتراضية مختلفة (ليست 0)
WHERE العمود =>bit
ولكن، وهذا يعمل فقط ل> 0 القيم في عمود رقمي. bit سيتم يلقي ضمنيا لكثافة العمليات، صحيح صغير غيرها بسبب نوع البيانات الأسبقية.