Oracleデータベースにブール型はありますか?


249

BITMs SQL Serverのデータ型と同様に、Oracleデータベースにブール型はありますか?


7
残念ながら、これが導入されたとき、OracleはANSI SQL:1999標準(en.wikipedia.org/wiki/SQL:1999)を完全にはサポートしていません。
ジェフリーケンプ

2
代替視点(なぜSQLがないはず boolean型を持っている):vadimtropashko.wordpress.com/2010/09/16/...
ジェフリー・ケンプ

7
@JeffreyKempそのブログは無意味です。一部のブール値がテーブルの他のフィールドに基づいて計算される場合があるからといって、すべてのブール値フィールドが計算されるわけではありません。たとえば、「is_trusted_customer」は、人間が「私はその人を信頼している」と判断した場合にのみ当てはまります。
ジェイコブ

2
@JeffreyKempおめでとうございます。Cスタイルのブール値を再発明しました(int代わりにs を使用しています)。私たちは間違いなくコードのそれらに戻るべきです。さらに、テーブル列と(aからの)結果列の間のデータ型SELECTが共有される場合、引数は完全にバラバラになります。残りの引数が与えられた場合でも、計算結果としてブール値を返すことが絶対に適切だからです。
jpmc26

2
はい。booleansのようなより多くのデータ型はより正確な表現力を与えます-あなたはその面で私から議論を受けることはありません。少なくともDATE型があることをうれしく思います
Jeffrey Kemp

回答:


277

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は真です。:)
ジムデイビス

4
Michael-O:何度か見たことがあります。私にとっては常に0/1ですが、他のプログラマーはJ / Nを好みます。(私はドイツ語圏の国に住んでいます)
Erich Kitzmueller、

11
@Irfy最近、私が見たNFするので、使用されているONOFF同じ文字で始まる...
JimmyB

7
ブール値の代わりに 'T' / 'F'を使用する方が理にかなっていると主張する人もいるでしょう
Erich Kitzmueller

55

いいえ。

使える:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- Oracleをお楽しみください

または、ここで説明するようにchar 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そのNUMBER:Typ=2 Len=2: 193,2少なくとも12cでは、NUMBER(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); }
阿木Hammerthief

3
@AgiHammerthief真ができますが、私はむしろ私のオプションがあることを知っているであろう、「ブール」列に述語を使用して行検索する場合ColumnName = 0またはColumnName = 1ではなく、ColumnName = 0かとColumnName <> 0。最後のセマンティクスはプログラマーフレンドリーではありません。また、2つの値を設定することで、クエリオプティマイザーにとってよりシンプルにしたいと考えています。
David Aldridge

14

SQLレベルではなく、残念ですPLSQLには1つあります


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'(型文字)、または 'true' / 'false'(型varchar2)を使用できます。



4

一般的なスペース節約のトリックは、ブール値をNUMBERではなくOracle CHARとして格納することです。


4
CHAR(1)とVARCHAR2(1)は、スペース使用量が同じです。
トニーアンドリュース

3
ここで学んだように、docs.oracle.com / cd / E17952_01 / refman-5.5-en / char.htmlで 1つの文字をストーリー化すると、charとvarcharの間にのみ違いがあります-charは1バイトを使用しますが、varcharは空のスペースに1バイトを使用します+ 1文字に1バイト-> varchar(varchar2)は1文字に2バイトを使用<<charが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-<皮肉>それは素晴らしいアイデアです!他のすべてのデータ型を取り除き、すべてをRAW列に格納する必要があります。その後、NOBODYがデータを勝手に誤って解釈する可能性があります!</ sarcasm>
ボブジャービス-モニカを復活させます

データ型を定義する方法があり、 'raw(1)'型をブールまたはブールと名付けた「raw(1)」型をラップするブール型を作成できると想像してみてください。次に、内容に応じて「true」または「false」を出力する関数を定義できます。
ジェイコブ

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