มีประเภทบูลีนในฐานข้อมูล Oracle หรือไม่


250

มีประเภทบูลีนในฐานข้อมูล Oracle คล้ายกับBITประเภทข้อมูลใน Ms SQL Server หรือไม่


7
น่าเสียดายที่ Oracle ไม่สนับสนุนมาตรฐาน ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ) อย่างเต็มที่เมื่อมีการเปิดตัว
Jeffrey Kemp

2
มุมมองทางเลือก (ทำไม SQL ไม่ควรมีประเภทบูลีน): vadimtropashko.wordpress.com/2010/09/16/…
Jeffrey Kemp

7
@JeffreyKemp บล็อกนั้นไม่มีความรู้สึก เนื่องจากวาลเลย์บูลีนบางตัวอาจคำนวณจากฟิลด์อื่นในตารางไม่ได้หมายความว่าอาจคำนวณฟิลด์บูลีนทั้งหมด ตัวอย่างเช่น "is_trusted_customer" ซึ่งนี่เป็นเรื่องจริงถ้าหากมนุษย์ตัดสินใจว่า "ฉันเชื่อใจบุคคลนั้น"
จาค็อบ

2
@JeffreyKemp ขอแสดงความยินดีคุณเพิ่งสร้างนวัตกรรมบูลีนแบบ C (ซึ่งคุณใช้งานอยู่int) เราควรกลับไปหาคนที่อยู่ในรหัสอย่างแน่นอน นอกจากนี้อาร์กิวเมนต์ยังแยกออกจากกันอย่างสมบูรณ์หากชนิดข้อมูลระหว่างคอลัมน์ตารางและคอลัมน์ผลลัพธ์ (จากSELECT) ถูกใช้ร่วมกันเนื่องจากมีความเหมาะสมอย่างยิ่งที่จะส่งกลับบูลีนเป็นผลลัพธ์ที่คำนวณได้ในบางครั้งแม้จะได้รับอาร์กิวเมนต์ที่เหลือ
jpmc26

2
ใช่. ประเภทข้อมูลเพิ่มเติมเช่น booleans จะให้พลังการแสดงออกที่แม่นยำมากขึ้น - คุณจะไม่ได้รับการโต้แย้งจากฉันในหน้านั้น ฉันเราแค่ดีใจที่อย่างน้อยมีDATEประเภท - จินตนาการมีการจัดการกับการแสดงสตริงของทุกวันเวลา :)
เจฟฟรีย์เคมพ์

คำตอบ:


278

ไม่เพียง แต่ประเภทข้อมูลบูลีนหายไปใน SQL ของ Oracle (ไม่ใช่ PL / SQL) แต่พวกเขายังไม่มีคำแนะนำที่ชัดเจนเกี่ยวกับสิ่งที่จะใช้แทน ดูหัวข้อนี้ใน asktom จากการแนะนำCHAR(1) 'Y'/'N'พวกเขาเปลี่ยนเป็นNUMBER(1) 0/1เมื่อมีคนชี้ให้เห็นว่า'Y'/'N'ขึ้นอยู่กับภาษาอังกฤษในขณะที่เช่นโปรแกรมเมอร์เยอรมันอาจใช้'J'/'N'แทน

สิ่งที่เลวร้ายที่สุดคือพวกเขาปกป้องการตัดสินใจที่โง่เขลาเช่นเดียวกับที่พวกเขาปกป้อง''=NULLความโง่เขลา


9
1/0 คือถ้าไม่คลุมเครืออย่างน้อยคลุมเครือน้อย
Adam Musch

15
แต่ '' = NULL เป็นเท็จ! '' IS NULL เป็นจริง :)
จิมเดวิส

4
Michael-O: ฉันเคยเห็นมาหลายครั้งแล้ว สำหรับฉันมันคือ 0/1 ตลอดเวลา แต่โปรแกรมเมอร์คนอื่นชอบ J / N (ฉันอาศัยอยู่ในประเทศที่ใช้ภาษาเยอรมัน)
Erich Kitzmueller

11
@Irfy เร็ว ๆ นี้ผมเห็นNและFถูกนำมาใช้เพราะONและOFFเริ่มต้นด้วยตัวอักษรเดียวกัน ...
JimmyB

7
เราอาจแย้งว่าในฐานะที่เป็นตัวแทนของบูลีน 'T' / 'F' จะสมเหตุสมผลมากขึ้น
Erich Kitzmueller

56

Nope

สามารถใช้:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- เพลิดเพลินกับ Oracle

หรือใช้ถ่าน 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

ตามคำตอบของ Ammoq และ kupa เราใช้หมายเลข (1) ด้วยค่าเริ่มต้นที่ 0 และไม่อนุญาตให้มีค่า Null

นี่คือคอลัมน์เพิ่มเพื่อแสดง:

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

หวังว่านี่จะช่วยใครซักคน


17
โปรดทราบว่าคุณสามารถเก็บ -1 ไว้ในนั้นได้เช่นกัน คุณอาจเพิ่มข้อ จำกัด ในการตรวจสอบเพื่อ จำกัด ค่าให้เป็น 0 และ 1
David Aldridge

@DavidAldridge ในตรรกะบูลีนตัวเลขใด ๆ ที่ไม่ใช่ 0 (FALSE) จะเท่ากับ 1 (TRUE) ดังนั้นมันจึงไม่สำคัญว่าจะเก็บหมายเลขไว้เป็นจำนวนเท่าใด การเพิ่มฟังก์ชั่นที่ส่งกลับบูลีนจาก int นั้นเป็นเรื่องเล็กน้อย:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief

3
@AgiHammerthief ทรู แต่ถ้าคุณต้องการที่จะหาแถวใช้คำกริยาในคอลัมน์ "บูล" ผมค่อนข้างจะรู้ว่าตัวเลือกของฉันColumnName = 0หรือColumnName = 1มากกว่าหรือColumnName = 0 ColumnName <> 0ความหมายของคำสุดท้ายไม่เป็นมิตรกับโปรแกรมเมอร์ ฉันต้องการให้ง่ายขึ้นสำหรับตัวเพิ่มประสิทธิภาพการสืบค้นด้วยการมีสองค่า
David Aldridge

14

ไม่ได้อยู่ในระดับ SQL และนั่นก็น่าเสียดายมีหนึ่งใน PLSQL ว่า


13

ไม่ไม่มีประเภทบูลีนในฐานข้อมูล Oracle แต่คุณสามารถทำได้ดังนี้

คุณสามารถวางข้อ จำกัด การตรวจสอบในคอลัมน์

หากตารางของคุณไม่มีคอลัมน์ตรวจสอบคุณสามารถเพิ่ม:

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 (หมายเลขประเภท) หรือ 'Y' / 'N' (ประเภทถ่าน) หรือ 'จริง' / 'เท็จ' (ประเภท varchar2)



4

เคล็ดลับการประหยัดพื้นที่ทั่วไปคือการจัดเก็บค่าบูลีนเป็น Oracle CHARแทนที่จะเป็น NUMBER:


4
CHAR (1) และ VARCHAR2 (1) เหมือนกันในการใช้พื้นที่
Tony Andrews

3
อย่างที่ฉันได้เรียนรู้ที่นี่docs.oracle.com/cd/E17952_01/refman-5.5-en/char.htmlเมื่อเราเล่าเรื่องตัวละครตัวหนึ่งมีความแตกต่างระหว่างตัวละครตัวเดียวกับตัวอักษรตัวหนึ่ง - ตัวอักษรตัวหนึ่งใช้ตัวอักษรตัวหนึ่ง แต่ตัวตัวอักษรตัวหนึ่ง + 1 ไบต์สำหรับหนึ่งอักขระ -> varchar (varchar2) ใช้ 2 ไบต์สำหรับ 1 อักขระ <เมื่อถ่านใช้เพียง 1 ไบต์
Artem.Borysov

@ Artem.Borysov: คู่มือนั้นใช้สำหรับ MySQL ไม่ใช่สำหรับฐานข้อมูล Oracle
a_horse_with_no_name

3

เพียงเพราะยังไม่มีใครพูดถึง: การใช้ RAW (1) ก็ดูเหมือนจะเป็นเรื่องธรรมดา


1
raw (1) ยอดเยี่ยมเนื่องจากผู้ใช้ไม่สามารถเข้าใจสิ่งที่อยู่ในนั้นผู้ที่ทำการค้นหาต้องเข้าใจสิ่งที่อยู่ในคอลัมน์ raw (1) และแปลเป็นสิ่งที่มีความหมาย
จาค็อบ

13
<sarcasm> ใช่มันยอดเยี่ยมมากจนคุณไม่สามารถเขียนโค้ด jdbc แบบพกพาได้ </
sarcasm

@jacob - <sarcasm> นั่นเป็นความคิดที่น่าทึ่ง! เราควรกำจัดชนิดข้อมูลอื่นทั้งหมดและเก็บทุกอย่างไว้ในคอลัมน์ RAW! จากนั้นไม่มีใครสามารถตีความข้อมูลโดยพลการได้! </sarcasm>
Bob Jarvis - Reinstate Monica

ลองนึกภาพว่ามี oracle ในการกำหนดประเภทข้อมูลเพื่อให้เราสามารถสร้างประเภทบูลที่ล้อมประเภท 'raw (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 ไม่ได้และทำให้เกิดข้อผิดพลาดของตัวดำเนินการสัมพันธ์ที่ไม่ถูกต้อง
Richard Pascual
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.