SQLite - COALESCE परिणाम आदेश तोड़ता है - एसक्यूएल, एसक्लाइट

मेरे पास एक SQLite तालिका है (संदेशों के लिए)। तालिका के क्रम में दो कॉलम हैं: created तथा sent। मुझे परिणाम क्रमबद्ध करने की आवश्यकता है sent क्षेत्र (मूल), लेकिन अगर 0 है, तो द्वारा created क्षेत्र (भी वंश)।

मैं एसक्यूएल-फ़ंक्शन का उपयोग कर रहा हूं COALESCE, लेकिन परिणाम का क्रम गलत है।

सामान्य परिणाम (बिना COALESCE):

SELECT * FROM messages ORDER BY sent DESC
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │ 1463793493 │ <-
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
└─────────────┴──────────┴────────────┴────────────┘

गलत परिणाम (COALESCE के साथ):

SELECT * FROM messages ORDER BY COALESCE(sent,created)=0 DESC
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │ 1463793493 │ <-
└─────────────┴──────────┴────────────┴────────────┘

मैंने अभिव्यक्ति को हटाने की कोशिश की =0, तो ऑर्डर सही है, लेकिन यह अनुरोध सही तरीके से काम नहीं करता है sent = 0:

SELECT * FROM messages ORDER BY COALESCE(sent,created) DESC
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │ 1463793493 │ <-
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
└─────────────┴──────────┴────────────┴────────────┘
but
┌─────────────┬──────────┬────────────┬────────────┐
│ external_id │   body   │  created   │    sent    │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    Te    │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │  huyak   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │   tete   │ 1463783516 │ 1463662248 │
├─────────────┼──────────┼────────────┼────────────┤
│     ...     │    qw    │ 1463793500 │     0      │ <-
└─────────────┴──────────┴────────────┴────────────┘

क्या किसी को पता है कि यह क्यों हो रहा है और इसे कैसे ठीक किया जाए?

उत्तर:

जवाब के लिए 2 № 1

COALESCE एनयूएलएल को संभालता है, यह आपको यहां मदद नहीं करता है। यह हमेशा वापस आ जाएगा sent आप को। यदि आप इसके परिणाम की तुलना शून्य से करते हैं तो आप केवल इस पर आधारित सॉर्टिंग कर रहे हैं sent शून्य है या नहीं। आपको एक का उपयोग करना होगा CASE

... ORDER BY CASE sent WHEN 0 THEN created ELSE sent END DESC;

यदि आपके पास एनयूएलएल था जहां कोई टाइमस्टैम्प नहीं है तो आप इसका उपयोग कर सकते हैं COALESCE तुलना के बिना।


जवाब के लिए 0 № 2

COALESCE शून्य, शून्य नहीं हैडल संभालती है।

आप शून्य मानों को एनयूएलएल में परिवर्तित कर सकते हैं nullif () समारोह:

SELECT * FROM messages ORDER BY COALESCE(NULLIF(sent,0),created) DESC;

संबंधित सवाल
सबसे लोकप्रिय