سؤال

استفسار بسيط، ربما مستحيل ولكن أعلم أن هناك بعض الأشخاص الأذكياء :)

نظرًا لمعلمة منطقية، أرغب في تحديد عبارة المكان الخاصة بي إما للحد من إخراج عمود معين - أو عدم القيام بأي شيء.

لذلك، بالنظر إلى المعلمة @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 سيتم يلقي ضمنيا لكثافة العمليات، صحيح صغير غيرها بسبب نوع البيانات الأسبقية.

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