क्या SQL में बूलियन टेस्ट करने का यह उचित तरीका है?


81

मान लें कि एक सक्रिय "बूलियन फ़ील्ड" है (0 या 1 के साथ छोटा इंट,)

# Find all active users
select * from users where active 

# Find all inactive users
select * from users where NOT active 

शब्दों में, "नॉट" ऑपरेटर को सीधे बूलियन फ़ील्ड पर लागू किया जा सकता है?


हां, जैसा कि पोस्ट किया गया था, बूलियन फ़ील्ड आमतौर पर 'बिट' टाइप किए जाते हैं, 'इंट' नहीं
डेविस

मुझे लगता है कि आप वास्तव में अच्छे दिखने वाले कोड के बाद हैं, क्योंकि आपको कोई संदेह नहीं होगा कि "सक्रिय = 0" के बारे में पता नहीं है। "सक्रिय नहीं" और "सक्रिय = 0" के बीच चुनाव में, मैं परेशान नहीं करूंगा - यदि आपको आवश्यक रूप से समझाया जाना चाहिए, तो टिप्पणी जोड़ें। (यदि कोई व्यक्ति भविष्य में कोड के साथ काम कर रहा है, तो वह सही / गलत नहीं समझता है -> 1/0 संबंध, हो सकता है कि कोई आपके कोड को नहीं छू सकता है, btw ...)
टॉमस असचन

1
@ ईरिक: एसक्यूएल में एक विधेय को बूलियन परिणाम का उत्पादन करने की आवश्यकता होती है। एक "जहां सक्रिय" इस तरह के परिणाम का उत्पादन नहीं करता है, क्योंकि भले ही 'सक्रिय' एक बीआईटी डेटा प्रकार था - एक बीआईटी एक बूलियन मूल्य नहीं है, यह 0..1 की सीमा के साथ पूर्णांक मान है। तो आपको बूलियन का उत्पादन करने के लिए किसी प्रकार की तुलना करनी चाहिए । "जहां नहीं (सक्रिय = 1)" काम करेगा, लेकिन "जहां सक्रिय नहीं है"।
तोमलक

तोमलक - आपको उस टिप्पणी को उत्तर के रूप में पोस्ट करना चाहिए था!
womp

@ टोमलाक: "एसक्यूएल में एक विधेय परिणाम का उत्पादन करने की आवश्यकता होती है" - बिल्कुल नहीं। SQL तीन मान तर्क यानी TRUE, FALSE और UNKNOWN को प्रदर्शित करता है (विचार करें कि 'सक्रिय' पूर्ण हो सकता है)।
onedaywhen

जवाबों:


88

SQL में एक बूलियन एक सा क्षेत्र है। इसका मतलब 1 या 0. सही सिंटैक्स है:

select * from users where active = 1 /* All Active Users */

या

select * from users where active = 0 /* All Inactive Users */

14
@ JoseBasilio- PostgreSQL को छोड़कर: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin

अधिकांश DB में, फ़ील्ड NULL भी हो सकती हैं। यदि आप सक्रिय फ़ील्ड के लिए डिफ़ॉल्ट मान के साथ तालिका को कॉन्फ़िगर नहीं करते हैं, तो आपको NULL के लिए भी जांच करने की आवश्यकता हो सकती है।
IANNaN

(4) रेल के भीतर SQLite का उपयोग करते हुए इसने 'f' या 't' का उपयोग करके प्रश्न किए (हालांकि चार्ट के रूप में नहीं)। ऊपर क्वेरी का उपयोग करते समय यह काम नहीं किया। यद्यपि: SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'काम किया
स्टीफन हेंड्रिक्स

25

Postgres के साथ, आप उपयोग कर सकते हैं

select * from users where active

या

select * from users where active = 't'

यदि आप पूर्णांक मान का उपयोग करना चाहते हैं, तो आपको इसे एक स्ट्रिंग के रूप में विचार करना होगा। आप पूर्णांक मान का उपयोग नहीं कर सकते।

select * from users where active = 1   -- Does not work

select * from users where active = '1' -- Works 

यह देखने के लिए कि यह सही है या TRUE या 1 की अपेक्षा कर रहा है, तो सभी ने देखा, इसलिए आपका उत्तर बहुत मददगार था
jpw

4
+1 PostgreSQL बूलियन विकल्पों पर अधिक: postgresql.org/docs/9.1/static/datatype-boolean.html
यारिन

1
Aslo, Posgtres, OP के सिंटैक्स को स्वीकार करता है: where active, where not activePostgresql.org/docs/8.2/static/functions-logical.html
Lo Augc Faugeron

13

MS SQL 2008 सही या गलत के स्ट्रिंग संस्करण का भी उपयोग कर सकता है ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'

वाह, यह अच्छा है ... मुझे नहीं पता था कि काम करता है, लेकिन निश्चित रूप से मेरे परीक्षण से 2008 में करता है।
मैक्सिम गेर्शकोविच

12

SQL सर्वर में आप आमतौर पर उपयोग करेंगे। मैं अन्य डेटाबेस इंजनों के बारे में नहीं जानता।

select * from users where active = 0

3

मैं व्यक्तिगत रूप से डेटाबेस के लिए 'Y' और 'N' के साथ char (1) का उपयोग करना पसंद करता हूं, जिसमें बूलियन के लिए मूल प्रकार नहीं है। पत्र संख्याओं की तुलना में अधिक उपयोगकर्ता हैं जो यह मानते हैं कि अब इसे पढ़ने वाले 1 सच से मेल खाते हैं और 0 झूठे से मेल खाते हैं।

'Y' और 'N' भी अच्छी तरह से मैप करते हैं (N) हाइबरनेट का उपयोग करते समय।


0

PostgreSQL बूलियन प्रकारों का समर्थन करता है, इसलिए आपकी SQL क्वेरी पूरी तरह से PostgreSQL में काम करेगी।


-1

यदि SQLite3 के उपयोग से उर हो:

इसमें केवल 't' या 'f' लगता है। 1 या 0. नहीं सही या गलत नहीं है।

बस कठिन तरीका सीखा है।


1
यह सच नहीं है। dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html : "ये प्रकार TINYINT (1) के लिए समानार्थक शब्द हैं। शून्य का मान गलत माना जाता है। गैर-मानों को सही माना जाता है"।
मोरिट्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.