2009-03-21 15 views
38

मैं max(id) का उपयोग कर अपनी तालिका में कई पंक्तियां प्राप्त करना चाहता हूं। जब यह NULL लौटाता है - यदि तालिका में कोई पंक्ति नहीं है - मैं 0 लौटना चाहता हूं। और जब पंक्तियां होती हैं तो मैं max(id) + 1 वापस लौटना चाहता हूं।SQLite - डेटाबेस में पंक्तियों की संख्या प्राप्त करना

मेरी पंक्तियों को 0 से और autoincreased से गिने जा रहे हैं।

SELECT CASE WHEN MAX(id) != NULL THEN (MAX(id) + 1) ELSE 0 END FROM words 

लेकिन यह हमेशा मुझे लौटा रहा है 0. मैंने क्या गलत किया है:

यहाँ मेरी बयान है?

उत्तर

13

आप के बजाय गिनती के मैक्स (आईडी) का उपयोग करने के लिए, तो पैक्स से टिप्पणी को पढ़ने के बाद चाहते हैं निम्नलिखित एसक्यूएल आप दे देंगे आप क्या चाहते हैं

SELECT COALESCE(MAX(id)+1, 0) FROM words 
+1

चालाक लेकिन केवल तभी काम करता है यदि आपके पास आधार 0 के साथ ऑटो int pk है। VolkerK का उत्तर सरल और अधिक प्रभावी है। – Rich

+2

@Rich। वोल्करके का जवाब वास्तव में आसान है और यह समाधान है कि मैं अपने साथ जाऊंगा, हालांकि, सवाल यह कहता है कि ओपी अधिकतम (आईडी) का उपयोग करना चाहता था और पंक्तियों को 0 से बढ़ा दिया गया था और ऑटो-वृद्धि हुई थी। –

+1

सच और सत्य। धन्यवाद – Rich

209

आप के साथ

SELECT Count(*) FROM tblName
देख https://www.w3schools.com/sql/sql_count_avg_sum.asp

+1

यह वास्तव में हमेशा काम करेगा, लेकिन इसे तालिका में सभी पंक्तियों को गिनाने के लिए स्क्लाइट की आवश्यकता होती है। यह अक्षम है यदि पंक्तियों की संख्या बड़ी है (> 10,000, कहें) – molecule

8

एसक्यूएल में पंक्तियों की वास्तविक संख्या को क्वेरी कर सकते हैं, शून्य = शून्य गलत है, तो आप आमतौर पर उपयोग करने के लिए शून्य है:

SELECT CASE WHEN MAX(id) IS NULL THEN 0 ELSE (MAX(id) + 1) END FROM words 

लेकिन, अगर आप चाहते हैं पंक्तियों की संख्या, आपको केवल count(id) का उपयोग करना चाहिए क्योंकि आपकी पंक्ति 10 (0,1,3,5,9) है, जहां इसे देना चाहिए।

यदि आप गारंटी दे सकते हैं कि आप हमेशा से आईडी 0 एन, अधिकतम (आईडी) +1 सूचकांक कार्यान्वयन के आधार पर तेज़ी से हो सकता है (यह पूरे पेड़ को घुमाने के बजाय संतुलित वृक्ष के दाहिने तरफ जाने के लिए तेज़ हो सकता है।

लेकिन यह बहुत ही कार्यान्वयन-विशिष्ट है और मैं इस पर भरोसा करने के खिलाफ सलाह दूंगा, कम से कम नहीं क्योंकि यह आपके प्रदर्शन को एक विशिष्ट डीबीएमएस पर लॉक करता है।

2

मैं एक ही समस्या मिल गया है, तो मैं समझता हूँ अपने सवाल सही ढंग से, मैं SQLite ऑपरेशन में प्रत्येक सम्मिलित प्रदर्शन के बाद अंतिम डाली गई आईडी जानना चाहता हूं। मैं निम्नलिखित बयान करने की कोशिश की:

select * from table_name order by id desc limit 1 

आईडी प्रथम स्तंभ और TABLE_NAME की प्राथमिक कुंजी है, का उल्लेख बयान मुझे सबसे बड़ा आईडी के साथ रिकॉर्ड दिखाते हैं।

लेकिन आधार यह है कि आपने कभी भी कोई पंक्ति नहीं हटाई है, इसलिए पंक्तियों की संख्या के बराबर आईडी की संख्या।

4

सुनिश्चित नहीं है कि मैं आपका प्रश्न समझता हूं, लेकिन अधिकतम (आईडी) आपको लाइनों की संख्या नहीं देगा। उदाहरण के लिए यदि आपके पास id = 13 के साथ केवल एक पंक्ति है (मान लीजिए कि आपने पिछली लाइनों को हटा दिया है), तो आपके पास अधिकतम (आईडी) = 13 होगा लेकिन पंक्तियों की संख्या 1 है। सही (और सबसे तेज़) समाधान का उपयोग करना है गिनती()। बीटीडब्ल्यू अगर आपको आश्चर्य है कि एक सितारा क्यों है, तो ऐसा इसलिए है क्योंकि आप मानदंडों के आधार पर लाइनों की गणना कर सकते हैं।

1

VolkerK के जवाब का विस्तार, नीचे दिए गए उदाहरण कोड थोड़ा और अधिक पठनीय बनाने के लिए, आप के रूप में उपयोग कर सकते हैं गिनती संदर्भ के लिए:

SELECT COUNT(*) AS c from profile

यह कुछ चौखटे में बहुत आसानी से पढ़ने के लिए बनाता है, उदाहरण के लिए , मैं एक्सपोनेंट (प्रतिक्रिया मूल) स्क्लाइट एकीकरण का उपयोग कर रहा हूं, और एएस कथन के बिना, कोड बहुत बदसूरत है।

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