ओरेकल डेटाबेस में कोई बूलियन प्रकार है?


250

ओरेकल डेटाबेस में कोई बूलियन प्रकार है, जैसे कि BITSQL SQL सर्वर में डेटाटाइप?


7
दुर्भाग्य से ओरेकल पूरी तरह से एएनएसआई एसक्यूएल का समर्थन नहीं करता है: 1999 मानक ( en.wikipedia.org/wiki/SQL:1999 ) जब यह पेश किया गया था।
जेफरी केम्प

2
वैकल्पिक दृष्टिकोण (एसक्यूएल का बूलियन प्रकार क्यों नहीं होना चाहिए ): vadimtropashko.wordpress.com/2010/09/16/…
जेफरी केम्प

7
@JeffreyKemp यह ब्लॉग गैर-संवेदी है। सिर्फ इसलिए कि कुछ बूलियन वैल्स की गणना एक तालिका में अन्य क्षेत्रों के आधार पर की जा सकती है, इसका मतलब यह नहीं है कि सभी बूलियन फ़ील्ड की गणना की जा सकती है। उदाहरण के लिए "is_trusted_customer" जहां यह सच है अगर और केवल अगर एक मानव निर्णय लेता है, "मुझे उस व्यक्ति पर भरोसा है।"
जेकब

2
@JeffreyKemp बधाई हो, आपने अभी-अभी सी-स्टाइल बूलियंस (जहां आप intइसके बजाय एस का उपयोग कर रहे हैं ) को फिर से किया है। हमें कोड में निश्चित रूप से वापस जाना चाहिए। इसके अतिरिक्त, तर्क पूरी तरह से अलग हो जाता है अगर तालिका प्रकार और परिणाम कॉलम (से SELECT) के बीच डेटा प्रकार साझा किए जाते हैं, क्योंकि एक बूलियन को गणना परिणाम के रूप में वापस करना बिल्कुल उचित है, यहां तक ​​कि कभी-कभी बाकी तर्क भी दिए जाते हैं।
jpmc26

2
हाँ। बुलियन जैसे अधिक डेटा प्रकार अधिक सटीक अभिव्यंजक शक्ति देंगे - आपको उस मोर्चे पर मुझसे कोई तर्क नहीं मिलेगा। मुझे बस खुशी है कि हमारे पास कम से कम एक DATEप्रकार है - हर समय तारीखों के स्ट्रिंग प्रतिनिधित्व से निपटने की कल्पना करें :)
जेफरी केम्प

जवाबों:


278

न केवल ओरेकल की एसक्यूएल (पीएल / एसक्यूएल) में बूलियन डेटाटाइप गायब है, बल्कि उन्हें इसके बजाय क्या उपयोग करना है, इसके बारे में भी कोई स्पष्ट सिफारिश नहीं है। इस धागे को आस्कटॉम पर देखें । सिफारिश करने से CHAR(1) 'Y'/'N'वे स्विच करते हैं NUMBER(1) 0/1जब कोई इंगित 'Y'/'N'करता है कि अंग्रेजी भाषा पर निर्भर करता है, जबकि उदाहरण के लिए जर्मन प्रोग्रामर 'J'/'N'इसके बजाय उपयोग कर सकते हैं ।

सबसे बुरी बात यह है कि वे इस मूर्खतापूर्ण निर्णय का बचाव करते हैं जैसे वे ''=NULLमूर्खता का बचाव करते हैं ।


9
1/0, यदि अस्पष्ट नहीं है, तो कम से कम अस्पष्ट।
एडम मस्क

15
लेकिन '' = NULL झूठा है! '' IS NULL सच है। :)
जिम डेविस

4
माइकल-ओ: मैंने कई बार देखा है। मेरे लिए, यह हर समय 0/1 है, लेकिन अन्य प्रोग्रामर जे / एन को पसंद करते हैं। (मैं एक जर्मन भाषी देश में रहता हूं)
एरच किट्ज़म्यूलर

11
@ हाल ही में, मैंने देखा Nऔर Fइस्तेमाल किया जा रहा है, क्योंकि ONऔर OFFएक ही अक्षर से शुरू होता है ...
JimmyB

7
एक तर्क दे सकता है कि एक बूलियन के प्रतिस्थापन के रूप में, 'T' / 'F' और भी अधिक समझ में आता है
Erich Kitzmueller

55

नहीं।

इस्तेमाल कर सकते हैं:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- ओरेकल का आनंद लें

या यहाँ वर्णित के रूप में चार Y / N का उपयोग करें


6
मैं चार (1) पसंद करता हूं क्योंकि यह कम जगह का उपयोग करता है। आप इसे इस तरह से देख सकते हैं: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; वह CHAR संग्रहीत है: Typ=96 Len=1: 89और वह नंबर: Typ=2 Len=2: 193,2कम से कम 12c में, NUMBER (1) में 2 बाइट्स का उपयोग किया जा सकता है ...
phil_w

38

अम्मो और कुपा के उत्तरों के अनुसार, हम 0 के डिफ़ॉल्ट के साथ नंबर (1) का उपयोग करते हैं और नल की अनुमति नहीं देते हैं।

यहां एक कॉलम प्रदर्शित करने के लिए है:

ALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);

आशा है कि यह किसी की मदद करता है।


17
ध्यान दें कि आप -1 को वहां भी स्टोर कर सकते हैं। आप मानों को 0 और 1. तक सीमित करने के लिए उस पर एक चेक बाधा जोड़ सकते हैं
डेविड एल्ड्रिज

@DavidAldridge बूलियन तर्क में, कोई भी संख्या जो 0 (FALSE) नहीं है वह 1 (TRUE) के बराबर है, इसलिए इससे कोई फर्क नहीं पड़ता कि कौन सी संख्या संग्रहीत है, एक चेक बाधा की आवश्यकता को शून्य करते हुए। एक समारोह जो एक बूलियन को एक इंट से लौटाता है, तुच्छ है:boolean intToBool(int in) { return (in != 0); }
एजी हैमरथिफ़ जूल

3
@AgiHammerthief यह सच है, लेकिन आप "बूलियन" कॉलम पर एक विधेय का उपयोग कर मैं नहीं बल्कि पता होगा कि मेरे विकल्प हैं पंक्तियों को खोजना चाहते हैं ColumnName = 0या ColumnName = 1के बजाय ColumnName = 0या ColumnName <> 0। पिछले एक के शब्दार्थ कार्यक्रम के अनुकूल नहीं हैं। मैं दो मान होने से क्वेरी ऑप्टिमाइज़र के लिए इसे और अधिक सरल रखना चाहूंगा।
डेविड एल्ड्रिज

14

एसक्यूएल स्तर पर नहीं है और यह अफ़सोस की बात है कि PLSQL में एक है


13

नहीं, ओरेकल डेटाबेस में एक बूलियन प्रकार नहीं है, लेकिन आप इस तरह से कर सकते हैं:

आप एक स्तंभ पर एक चेक बाधा डाल सकते हैं।

यदि आपकी तालिका में चेक कॉलम नहीं है, तो आप इसे जोड़ सकते हैं:

ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';

जब आप एक रजिस्टर जोड़ते हैं, तो डिफ़ॉल्ट रूप से यह कॉलम 1 प्राप्त करता है।

यहां आप एक मान डालते हैं जो कॉलम मान को सीमित करता है, केवल 1 या 0 डालते हैं

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));

9

कोई भी प्रकार बूलियन मौजूद नहीं है, लेकिन इसके बजाय आप 1/0 (प्रकार संख्या), या 'वाई' / 'एन' (टाइप चार), या 'सच' / 'गलत' (प्रकार varchar2) कर सकते हैं।



4

एक सामान्य स्थान-बचत चाल बूलियन मूल्यों को संख्या के बजाय एक Oracle CHAR के रूप में संग्रहीत कर रही है :


4
अंतरिक्ष उपयोग में CHAR (1) और VARCHAR2 (1) समान हैं।
टोनी एंड्रयूज

3
जैसा कि मैंने यहाँ सीखा docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html जब हम एक कहानी की चर्चा करते हैं तो केवल चार और वर्चर के बीच अंतर मौजूद होता है - चार बाइट का उपयोग करता है, लेकिन varchar खाली जगह पर 1 बाइट का उपयोग करता है एक वर्ण के लिए + 1 बाइट -> वरचर (varchar2) 1 वर्ण के लिए 2 बाइट्स का उपयोग करता है <जब चार केवल बाइट का उपयोग करता है
Artem.Borysov

@ Artem.Borysov: यह मैनुअल MySQL के लिए है, Oracle डेटाबेस के लिए नहीं
a_horse_with_no_name

3

सिर्फ इसलिए कि किसी ने अभी तक इसका उल्लेख नहीं किया है: रॉ (1) का उपयोग करना भी आम बात है।


1
कच्चा (1) महान है, जिसमें उपयोगकर्ता यह नहीं मान सकता है कि इसमें क्या है, क्वेरी करने वाले व्यक्ति को समझना होगा कि कच्चे (1) कॉलम में क्या है और इसे किसी सार्थक में अनुवाद करें।
जेकब

13
<कटाक्ष> हाँ यह बहुत अच्छा है कि आप इसके साथ पोर्टेबल jdbc कोड नहीं लिख सकते। </ sarcasm>
chubbsondubs

@jacob - <व्यंग्य> यह एक अद्भुत विचार है! हमें अन्य सभी डेटा प्रकारों से छुटकारा पाना चाहिए और रॉ कॉलम में सब कुछ स्टोर करना चाहिए! तब NOBODY मनमाने ढंग से डेटा की गलत व्याख्या कर सकता था! </ Sarcasm>
बॉब जार्विस -

कल्पना करें कि डेटा प्रकारों को परिभाषित करने के लिए ओरेकल में कोई रास्ता था ताकि हम एक बूल प्रकार बना सकें जो 'रॉ (1)' प्रकार को लपेटता है जो इसे बूल या बूलियन नाम देता है। फिर हम सामग्री के आधार पर 'सही' या 'गलत' प्रिंट करने के लिए एक फ़ंक्शन को परिभाषित कर सकते हैं।
जैकब

-1
DECLARE
error_flag  BOOLEAN := false;
BEGIN

error_flag := true;
--error_flag := 13;--expression is of wrong type

  IF error_flag THEN 

UPDATE table_a SET id= 8 WHERE id = 1;

END IF;
END;

यह उदाहरण काम करता है। मैंने यह भी देखा कि मैं केवल PL / SQL के भीतर बूलियन प्रकारों के साथ काम कर सकता हूं। SQL के भीतर बुलियन कॉल नहीं करता है, और एक अवैध संबंधपरक ऑपरेटर त्रुटि देता है।
रिचर्ड पास्कल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.