sql - قيمة - دالة تغيير لون الخلية



تطبيق الدالة MIN التجميعية على حقل BIT (5)

اريد ان اكتب الاستعلام التالي:

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...

المشكلة هي ، SQL Server لا يحب ذلك ، عندما أريد حساب الحد الأدنى لقيمة حقل بت أنها ترجع خطأ Operand data type bit is invalid for min operator .

يمكنني استخدام الحل البديل التالي:

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...

ولكن ، هل هناك شيء أكثر أناقة؟ (على سبيل المثال ، قد تكون هناك دالة تجميعية ، لا أعرفها ، وتقوم بتقييم المنطقي وقيم البت في حقل.)


Answer #1

AVG (CAST (boolean_column AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE

إعطاء منطقيًا ضبابيًا:

  • 1 تشير إلى أن هذا كله صحيح.

  • 0 تشير إلى أن كل هذا خطأ ؛

  • قيمة بين] 0..1 [يشير إلى التطابق الجزئي ويمكن أن يكون جزءًا من الحقيقة.


Answer #2

جرب ما يلي ملاحظة: تمثل الحد الأدنى والدالة التجميعية ، تمثل Max أو دالة التجميع

SELECT   ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)...
FROM     ...
WHERE    ...
GROUP BY ...

نفس النتيجة


Answer #3

لقد عمل هذا الرمز الصغير دائمًا معي كسحر:

CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField

Answer #4

نظرًا لوجود خيارين فقط لـ BIT ، ما BIT سوى استخدام بيان الحالة:

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

هذا له ميزة:

  • عدم فرض مسح الجدول (الفهرسة في حقول BIT حد كبير لا تعتاد)
  • قصر الدائرة مرتين (مرة واحدة ل EXISTS ومرة أخرى CASE )

إنه رمز أكثر قليلاً للكتابة ولكن لا ينبغي أن يكون فظيعًا. إذا كان لديك قيم متعددة للتحقق من أنه يمكنك دومًا تغليف مجموعة النتائج الأكبر (مع كل معايير JOIN و FILTER ) في CTE في بداية الاستعلام ، ثم الإشارة إلى ذلك في عبارات CASE .


Answer #5
select min(convert(int, somebitfield))

أو إذا كنت ترغب في الحفاظ على النتيجة قليلا

select convert(bit, min(convert(int, somebitfield)))




tsql