वास्तविक को sqlite में परिवर्तित करना


85

Sqlite रिटर्न पूर्णांक मान में विभाजन

sqlite> select totalUsers/totalBids from 
(select (select count(*) from Bids) as totalBids , 
(select count(*) from Users) as totalUsers) A;
1

क्या हम परिणाम का वास्तविक मूल्य प्राप्त करने के लिए परिणाम टाइप कर सकते हैं?

जवाबों:


126

संख्याओं में से एक को गुणा करें 1.0:

SELECT something*1.0/total FROM somewhere

यह आपको पूर्णांक विभाजन के बजाय फ्लोटिंग पॉइंट डिवीजन देगा।


4
यह SQLite 3.15 के साथ मेरे लिए काम नहीं करता है .. @AdamGarner द्वारा समाधान करता है।
मा 0

1
आपको वास्तव में इस ट्रिक का उपयोग नहीं करना चाहिए, क्योंकि डेवलपर्स के लिए (स्वयं सहित) आसान है कि वे वापस आएं और अनावश्यक कोड जैसा दिखता है उसे हटा दें। जैसा कि मैंने नीचे सुझाया है सबसे अच्छा अभ्यास तैरने के लिए डालना होगा।
एडम गार्नर

1
यह एक हैक है। सबसे अच्छा, सबसे स्पष्ट, ऐसा करने का तरीका कास्ट का उपयोग करना है। यह भी संभावना है कि यह विशिष्ट परिदृश्यों में पेंच हो सकता है। मैंने एक क्वेरी के आधार पर तालिका बनाते समय इस तरह से असफल देखा है। मूल्य तय करने से उस समस्या का समाधान होता है।
माइक

57

Sqlite में किसी अन्य पूर्णांक द्वारा पूर्णांक का विभाजन हमेशा निकटतम पूर्णांक के लिए होगा।

इसलिए यदि आप अपने नाविक को नाव पर ले जाते हैं:

SELECT CAST(field1 AS FLOAT) / field2

1
तो क्या यह बेहतर है कि int को मैन्युअल रूप से फ्लोट करें या 1.0 के साथ गुणा करें (जैसा कि @NullUserException ने उत्तर दिया है)?
फेलिक्स एडलमैन

2
हाँ, एक साधारण कारण के लिए। आपके बारे में स्पष्ट हो रहा है कि आप क्या करने का इरादा रखते हैं। और उस चीज़ में नहीं डालना जो अन्य डेवलपर्स पर निर्भर करता है यह जानकर कि आपने 1. से गुणा क्यों किया है
एडम गार्नर

4
@FelixEdelmann इसके अलावा, यदि आप स्पष्ट रूप से फ्लोट के रूप में नहीं आते हैं, तो आप स्वयं भी भूल सकते हैं कि आपके पास 1.0 क्यों है, और इसे किसी बिंदु पर हटा दें। यह सिर्फ अन्य डेवलपर्स पर लागू नहीं होता है।
danuker

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


3

या यदि आप टेक्स्ट कॉलम के आधार पर कॉलम अपडेट करना चाहते हैं:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.