Oracle 데이터베이스에 부울 유형이 있습니까?


250

BITMs SQL Server 의 데이터 유형 과 유사한 Oracle 데이터베이스에 부울 유형이 있습니까?


7
불행히도 오라클은 이것이 도입되었을 때 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"는 사람이 "그 사람을 신뢰합니다"라고 결정하는 경우에만 해당됩니다.
— Jacob

2
@JeffreyKemp 축하합니다. 방금 C 스타일 부울을 다시 개발했습니다 ( int대신에 s를 사용하는 곳 ). 우리는 분명히 코드로 돌아 가야합니다. 또한 테이블 열과 결과 열 (a의 SELECT) 사이의 데이터 유형 이 공유 되면 인수가 완전히 분리됩니다. 때로는 인수의 나머지 부분이 주어지면 계산 결과로 부울을 반환하는 것이 절대적으로 적합하기 때문입니다.
— jpmc26

2
예. 부울과 같은 더 많은 데이터 유형은보다 정확한 표현력을 제공합니다. 앞에서 나에게 논쟁의 여지가 없습니다. 나는 우리가 최소한 DATE타입을 가지고있어서 다행이다 -항상 날짜의 문자열 표현을 다루어야한다고 상상해보십시오. :)
— Jeffrey Kemp

답변:


278

부울 데이터 유형이 Oracle SQL (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이 true입니다. :)
— Jim Davis

4
Michael-O : 여러 번 봤습니다. 나를 위해 항상 0/1이지만 다른 프로그래머는 J / N을 선호합니다. (I는 독일어권 나라에 살고)
— 에리히 Kitzmueller

11
@Irfy 최근, I 톱 N하고 F있기 때문에, 사용 ON과 OFF같은 문자로 시작 ...
— JimmyB

7
부울을 대체하기 위해 'T'/ 'F'가 더 의미가 있다고 주장 할 수 있습니다.
— Erich Kitzmueller

56

아니.

사용할 수 있습니다 :

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- 오라클을 즐기십시오

또는 여기에 설명 된대로 문자 Y / N 을 사용 하십시오.


6
적은 공간을 사용하기 때문에 char (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,212C에 적어도, 번호 (1) 2 바이트를 사용할 수 있습니다 ...
— phil_w

38

Ammoq 및 kupa의 답변에 따라 기본값 0을 사용하여 number (1)을 사용하고 null을 허용하지 않습니다.

다음은 시연을 위한 추가 열입니다 .

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

이것이 누군가를 돕기를 바랍니다.


17
거기에도 -1을 저장할 수 있습니다. 당신은 0과 1로 제한 값이에 점검 제한 조건을 추가 할 수 있습니다
— 데이비드 드리지

@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 Database에는 부울 유형이 없지만 다음과 같이 할 수 있습니다.

점검 제한 조건을 열에 둘 수 있습니다.

테이블에 검사 열이 없으면 추가 할 수 있습니다.

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'(유형 문자) 또는 'true'/ 'false'(유형 varchar2)를 사용할 수 있습니다.



4

일반적인 공간 절약 트릭은 부울 값을 NUMBER가 아닌 Oracle CHAR 로 저장 하는 것입니다.


4
CHAR (1) 및 VARCHAR2 (1)은 공간 사용량이 동일합니다.
— Tony Andrews

3
여기서 배운 것처럼 docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html 한 문자를 이야기 할 때 char와 varchar 사이에는 차이가 있습니다-char는 1 바이트를 사용하지만 varchar는 빈 공간에 1 바이트를 사용합니다 한 문자에 +1 바이트-> varchar (varchar2) 문자가 1 바이트 만 사용하는 경우 1 문자에 2 바이트를 사용
— Artem.Borysov

@ Artem.Borysov :이 매뉴얼은 Oracle 데이터베이스가 아닌 MySQL을위한 것입니다.
— a_horse_with_no_name

3

아직 아무도 언급하지 않았기 때문에 RAW (1)을 사용하는 것도 일반적인 관행으로 보입니다.


1
raw (1)은 사용자가 내용을 추측 할 수 없기 때문에 쿼리를 수행하는 사람은 raw (1) 열의 내용을 이해하고 의미있는 것으로 변환해야합니다.
— Jacob

13
<풍자> 네, 그것은 당신이 그것으로 휴대용 JDBC 코드를 작성할 수 없을 정도로 좋아요 </ 풍자>.
— chubbsondubs

@jacob-<sarcasm> 놀라운 아이디어입니다! 다른 모든 데이터 유형을 제거하고 모든 것을 RAW 열에 저장해야합니다! 그리고 아무도 임의로 데이터를 잘못 해석 할 수 없었다 </ 풍자>!
— 밥 자비스 - 분석 재개 모니카

oracle에 데이터 유형을 정의하는 방법이 있다고 가정하여 'raw (1)'유형을 bool 또는 boolean으로 감싸는 bool 유형을 만들 수 있다고 상상해보십시오. 그런 다음 내용에 따라 'true'또는 'false'를 인쇄하는 함수를 정의 할 수 있습니다.
— Jacob

-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.