2010-06-20 9 views
11

मैं एक ही पंक्ति में पंक्ति के दो स्तंभों में सबसे कम संख्या को खोजने की कोशिश कर रहा हूं, चेतावनी के साथ कि कॉलम में से कोई एक विशेष पंक्ति में शून्य हो सकता है। यदि कॉलम में से कोई एक शून्य है, तो मैं चाहता हूं कि उस पंक्ति के लिए दूसरे कॉलम में मान लौटाया जाए, क्योंकि यह इस मामले में सबसे कम गैर-शून्य स्तंभ है। अगर मैं कम से कम() फ़ंक्शन का उपयोग MySQL 5.1:एसक्यूएल में एक विशेष पंक्ति में कम से कम गैर-शून्य कॉलम कैसे खोजें?

select least(1,null) 

यह शून्य देता है, जो मैं नहीं चाहता हूं। मुझे इस मामले में 1 लौटने के लिए पूछताछ की आवश्यकता है।

मैं परिणाम मैं इस प्रश्न के साथ सामान्य रूप में चाहते कर लिया है:

select least(coalesce(col1, col2)) , coalesce(col2,col1)) 

जब तक col1 के रूप में और col2 हैं दोनों नहीं अशक्त प्रत्येक सम्मिलित बयान एक नंबर वापस आ जाएगी, और कम से कम () सबसे कम खोजने के लिए हैंडल।

क्या ऐसा करने का एक आसान/तेज़ तरीका है? मैं इस उदाहरण में MySQL का उपयोग कर रहा हूं लेकिन सामान्य समाधान का स्वागत है।

+1

तेजी से? क्या आपने इसे धीमा करने के लिए निर्धारित किया है? –

+0

ने इसे धीमा होने के लिए तय नहीं किया है, लेकिन यह संभवतः एक के बजाय 3 कार्यों को बुला रहा है। मैं इसे एक प्रश्न के खंड द्वारा क्रम में उपयोग कर रहा हूं, जितनी जल्दी हो सके मुझे जितनी जल्दी हो सके। –

उत्तर

11

दुर्भाग्य से (आपके मामले के लिए) न्यूनतम का व्यवहार MySQL 5.0.13 (http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_least) में बदला गया था - यह केवल तब तक वापस लौटाता था जब सभी तर्क न्यूल होते हैं।

यह परिवर्तन एक बग के रूप में भी रिपोर्ट किया गया था: http://bugs.mysql.com/bug.php?id=15610 लेकिन यह फिक्स केवल MySQL दस्तावेज़ों के लिए था, जिसमें नए व्यवहार और संगतता ब्रेक की व्याख्या हुई थी।

आपका समाधान अनुशंसित कामकाज में से एक था। एक और यदि ऑपरेटर का उपयोग किया जा सकता है:

SELECT IF(Col1 IS NULL OR Col2 IS NULL, COALESCE(Col1, Col2), LEAST(Col1,Col2)) 
3

इसमें कुछ समय बेहतर प्रदर्शन कर सकते हैं (इसी MySql वाक्य रचना करने के लिए परिवर्तित किया जा सकता है):

SELECT 
    CASE 
    WHEN Col1 IS NULL THEN Col2 
    WHEN Col2 IS NULL THEN Col1 
    ELSE Least(Col1, Col2) 
    END 

एक अन्य विकल्प (शायद धीमी हालांकि, लेकिन एक कोशिश के लायक):

SELECT Col1 
WHERE Col2 IS NULL 
UNION 
SELECT Col2 
WHERE Col1 IS NULL 
UNION 
SELECT least(Col1, Col2) 
WHERE Col1 IS NOT NULL AND Col2 IS NOT NULL 
3

सभी मूल्यों null होना होने की कोने मामले स्थिति पर निर्भर करता है, मैं इस तरह के वाक्य रचना है, जो अधिक पठनीय है के लिए जाना होगा (एक आसान समाधान अगर आप ठीक दो ही स्तंभ है नीचे है !)

SELECT LEAST(IFNULL(5, ~0 >> 1), IFNULL(10, ~0 >> 1)) AS least_date; 
-- Returns: 5 

SELECT LEAST(IFNULL(null, ~0 >> 1), IFNULL(10, ~0 >> 1)) AS least_date; 
-- Returns: 10 

SELECT LEAST(IFNULL(5, ~0 >> 1), IFNULL(null, ~0 >> 1)) AS least_date; 
-- Returns: 5 

SELECT LEAST(IFNULL(null, ~0 >> 1), IFNULL(null, ~0 >> 1)) AS least_date 
-- Returns: @MAX_VALUE (If you need to use it as default value) 

SET @MAX_VALUE=~0 >> 1; 
SELECT LEAST(IFNULL(null, @MAX_VALUE), IFNULL(null, @MAX_VALUE)) AS least_date; 
-- Returns: @MAX_VALUE (If you need to use it as default value). Variables just makes it more readable! 

SET @MAX_VALUE=~0 >> 1; 
SELECT NULLIF(
    LEAST(IFNULL(null, @MAX_VALUE), IFNULL(null,@MAX_VALUE)), 
    @MAX_VALUE 
) AS least_date; 
-- Returns: NULL 

मेरी पसंदीदा तरीका अगर

  • आपको लगता है कि कम से कम एक स्तंभ सुनिश्चित कर सकते हैं है कि नहीं किया जा सकता NULL
  • +०१२३५१६४१०६१ कोने मामले स्थिति में
  • (सभी स्तंभों NULL कर रहे हैं) आप जो किसी भी संभावित मान से अधिक या एक निश्चित सीमा से करने के लिए सीमित प्राप्त कर सकते हैं
  • आप चर के साथ सौदा कर सकते हैं इस बयान और भी अधिक पठनीय
  • बनाने के लिए एक गैर-शून्य डिफ़ॉल्ट मान चाहते हैं

यदि आप खुद से सवाल करते हैं कि ~0 >> 1 का अर्थ है: यह कहने के लिए बस एक छोटा सा हाथ है "मुझे सबसे बड़ी संख्या दें"।यह भी देखें: https://stackoverflow.com/a/2679152/2427579

और भी बेहतर, यदि आप केवल दो कॉलम है, तो आप उपयोग कर सकते हैं:

SELECT LEAST(IFNULL(@column1, @column2), IFNULL(@column2, @column1)) AS least_date; 
-- Returns: NULL (if both columns are null) or the least value 
0

क्यों एक स्तंभ का मान सेट नहीं है जब यह शून्य है अन्य स्तंभ के बराबर होना चाहिए?

SELECT LEAST(IFNULL(COL1, COL2), IFNULL(COL2, COL1)); 

उपरोक्त कोड के साथ, शून्य मान को तब तक अनदेखा कर दिया जाएगा जब तक कि दोनों शून्य न हों।

उदा।

Col1 = शून्य, Col2 = 5

LEAST(IFNULL(NULL, 5), IFNULL(5, NULL)) -> LEAST(5, 5) -> 5 

Col1 = 3, Col2 = शून्य

LEAST(IFNULL(3, NULL), IFNULL(NULL, 3)) -> LEAST(3, 3) -> 3 

Col1 = शून्य, Col2 = शून्य

LEAST(IFNULL(NULL, NULL), IFNULL(NULL, NULL)) -> LEAST(NULL, NULL) -> NULL 
संबंधित मुद्दे