एक बीआईटी क्षेत्र में MIN समग्र कार्य को लागू करना


82

मैं निम्नलिखित प्रश्न लिखना चाहता हूं:

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

समस्या यह है, SQL सर्वर इसे पसंद नहीं करता है, जब मैं बिट फ़ील्ड के न्यूनतम मूल्य की गणना करना चाहता हूं तो यह त्रुटि देता है Operand data type bit is invalid for min operator

मैं निम्नलिखित वर्कअराउंड का उपयोग कर सकता हूं:

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

लेकिन, वहाँ कुछ और अधिक सुंदर है? (उदाहरण के लिए, एक समग्र कार्य हो सकता है, जो मुझे नहीं पता, और जो andकिसी क्षेत्र में बिट मानों के तार्किक का मूल्यांकन करता है ।)


2
@ एडम रॉबिन्सन: जाहिर है,Operand data type bit is invalid for min operator.
एंडोमर

4
अधिक सुरुचिपूर्ण के बारे में नहीं जानते, लेकिन यह थोड़ा छोटा है। cast(min(SomeBitField+0) as bit)
मिकेल एरिकसन

5
@Andomar: जाहिर है अगर आपको पहले से ही समस्या है, हाँ, लेकिन अन्य समान मुद्दों वाले लोग त्रुटि संदेश पर खोज कर सकते हैं , इसलिए इस तरह की जानकारी प्रश्न में होनी चाहिए।
एडम रॉबिन्सन

जवाबों:


33

चूंकि केवल दो विकल्प हैं BIT, बस एक केस स्टेटमेंट का उपयोग करें:

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

इसका फायदा है:

  • टेबल स्कैन के लिए मजबूर न करना ( BITखेतों पर अनुक्रमणिका का कभी उपयोग न करना)
  • शॉर्ट सर्किटिंग ट्वाइस (एक बार EXISTSऔर फिर से CASE) के लिए

यह लिखने के लिए थोड़ा अधिक कोड है लेकिन यह भयानक नहीं होना चाहिए। यदि आपके पास यह जांचने के लिए कई मान हैं कि आप क्वेरी के आरंभ में अपने बड़े परिणाम सेट (सभी JOINऔर FILTERमानदंड के साथ) को हमेशा अलग कर सकते हैं CTE, तो CASEबयानों में संदर्भ दें।


10
bitयदि यह अशक्त है , तो इसके लिए तीन विकल्प हैं ।
मार्टिन स्मिथ

1
यदि bitस्तंभ में पूरी तरह से NULLमान शामिल हैं, तो MINवापस आ जाना चाहिए NULL
मार्टिन स्मिथ

8
मुझे एक "कम" प्रोग्रामर होना चाहिए, लेकिन मैं select 1 from ...उपनगर का पूरा उदाहरण देखना चाहूंगा । यह काफी मतलब नहीं है।
टीका

2
@Vaccano -SELECT 1 FROM Outertable WHERE bitfield=1
JNK

2
हालांकि मूल प्रश्न में ग्रुप बाय शामिल था। आपको समूह को WHERE में मापदंड द्वारा शामिल करने की आवश्यकता है।
17

156

एक विकल्प है MIN(SomeBitField+0)। यह अच्छी तरह से पढ़ता है, कम शोर के साथ (जो मैं लालित्य के रूप में योग्य होगा)।

उस ने कहा, यह CASEविकल्प से अधिक हैक-ईश है । और मुझे गति / दक्षता के बारे में कुछ भी पता नहीं है।


@, बहुत बहुत धन्यवाद, यह मेरी मदद मेरी SQL क्वेरी के लिए।
पाटसनलाइनर

@, क्या आपके पास +0 के कुछ दस्तावेज हैं ?, इसके लिए देखने की कोशिश की, लेकिन कुछ भी नहीं पाया, सिर्फ संदर्भों के लिए :)
फ्रांसिस्को सेविला

1
@FranciscoSevilla मेरा मानना ​​है कि यह अंतर्निहित पूर्ववर्ती रूपांतरण के कारण है: docs.microsoft.com/en-us/sql/t-sql/data-types/…
बेन मोशर

7

यह क्वेरी सबसे अच्छा समाधान है:

SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn
 FROM MyTable

जब आप BitField + 0 जोड़ते हैं तो यह स्वतः इंट की तरह हो जाएगा



6

निम्नलिखित नोट आज़माएँ : न्यूनतम प्रतिनिधित्व और कुल कार्य, अधिकतम प्रतिनिधित्व या समुच्चय समारोह

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

एक ही परिणाम


5

इस छोटे से कोड ने हमेशा मेरे साथ एक आकर्षण की तरह काम किया है:

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

2

AVG (CAST (बूलियन_ कॉलम के रूप में FLOAT)) OVER (...) AS BOOLEAN_AGGGATE

एक फजी बूलियन दें:

  • 1 इंगित करें कि यह सब सच है;

  • 0 इंगित करें कि यह सब गलत है;

  • 0..1 के बीच का मान आंशिक मिलान का संकेत देता है और यह सच्चाई का कुछ प्रतिशत हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.