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있기 때문에, 사용 ONOFF같은 문자로 시작 ...
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 = 0ColumnName = 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.