2011-08-09 15 views
56

मैं निम्न क्वेरी लिखना चाहते करने के लिए मिन समेकित फ़ंक्शन आवेदन:थोड़ा क्षेत्र

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

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

मैं निम्नलिखित तरीके को इस्तेमाल कर सकते हैं:

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

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

+2

@Adam रॉबिन्सन: जाहिर है, 'ओपेरैंड डेटा प्रकार बिट मिनट के लिए अमान्य है operator.' – Andomar

+3

के बारे में और अधिक सुरुचिपूर्ण पता नहीं है लेकिन यह एक * थोड़ा * कम है। 'कास्ट (न्यूनतम (कुछ बिटफिल्ल्ड + 0) बिट के रूप में)' –

+5

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

उत्तर

30

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

  • नहीं एक मेज स्कैन
  • लघु सर्किटिंग टी (BIT क्षेत्रों काफी इस्तेमाल कभी नहीं मिल सूचक) के लिए मजबूर:

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

    इस का लाभ दिया है WICE (EXISTS के लिए एक बार और फिर CASE के लिए)

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

+5

यदि यह शून्य है तो 'बिट' के लिए तीन विकल्प हैं। –

+0

@ मार्टिन - अच्छा बिंदु। यह इस परिस्थिति में क्वेरी को तब तक नहीं बदलेगा जब तक कि वे एक विशिष्ट तरीके से 'NULL' को संभालना नहीं चाहते हैं, क्योंकि हम समानता – JNK

+1

का परीक्षण कर रहे हैं यदि' बिट' कॉलम में पूरी तरह से 'NULL' मान शामिल हैं तो' MIN' को ' NULL'। –

97

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

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

+15

यह स्वीकार्य उत्तर होना चाहिए – Filip

4

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

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 ... 

इसी परिणाम

+0

कुल परिदृश्य के लिए अच्छी तरह से काम करता है! – Rama

3
select min(convert(int, somebitfield)) 

या आप अधिक बिट के रूप में परिणाम रखने के लिए

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

औसत (कास्ट (फ्लोट के रूप में boolean_column)) चाहते हैं (...) BOOLEAN_AGGREGATE के रूप में

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

  • 1 संकेत मिलता है कि सब सच है,

  • 0 इंगित करता है कि यह सब झूठा है;

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

संबंधित मुद्दे