149

昨日、ブールフィールドを Oracle テーブルに追加したいと思いました。ただし、実際には Oracle にはブール型のデータ型はありません。ブール値をシミュレートする最良の方法を知っている人はいますか? 件名をグーグルで検索すると、いくつかのアプローチが見つかりました

  1. 整数を使用し、それに 0 または 1 以外を割り当てないでください。

  2. 'Y' または 'N' の 2 つの値のみを持つ char フィールドを使用します。

  3. CHECK 制約で列挙型を使用します。

経験豊富な Oracle 開発者は、どちらのアプローチが優先/標準的であるかを知っていますか?

4

8 に答える 8

84

このリンクは便利だと思いました。

以下は、各アプローチの長所と短所の一部を強調した段落です。

最も一般的に見られる設計は、Oracle のデータ ディクショナリ ビューが使用する多くのブール型のフラグを模倣するもので、真の場合は「Y」、偽の場合は「N」を選択します。ただし、JDBC、OCCI、およびその他のプログラミング環境などのホスト環境と正しくやり取りするには、false の場合は 0、true の場合は 1 を選択して、getBoolean および setBoolean 関数で正しく動作できるようにすることをお勧めします。

基本的に、彼らは効率のために方法番号2を提唱し、

  • getBoolean()チェック制約付きの 0/1 の値(JDBC などとの相互運用性のため)
  • CHARのタイプ(NUMBER より少ないスペースを使用するため)。

彼らの例:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`
于 2008-08-27T13:23:06.247 に答える
28

Oracle 自体は、ブール値に Y/N を使用します。完全を期すために、pl/sql にはブール型があることに注意してください。そうでないのはテーブルだけです。

レコードを処理する必要があるかどうかを示すためにフィールドを使用している場合は、Y と NULL を値として使用することを検討してください。これにより、スペースをほとんど必要としない非常に小さな (読み取りが高速な) インデックスが作成されます。

于 2008-10-21T19:23:39.050 に答える
25

最小限のスペースを使用するには、'Y' または 'N' に制限された CHAR フィールドを使用する必要があります。Oracle は BOOLEAN、BIT、または TINYINT データ型をサポートしていないため、CHAR の 1 バイトは可能な限り小さくなっています。

于 2008-08-27T13:29:07.233 に答える
5

チェック制約付きの 1/0 または Y/N のいずれか。イーサウェイは大丈夫です。私は perl で多くの作業を行っているので、個人的には 1/0 を好みます。これにより、データベース フィールドでの perl ブール演算が非常に簡単になります。

オラクルのヘッドホンチョの1人とこの質問について本当に詳細な議論が必要な場合は、Tom Kyteがこれについて何を言っているのかをチェックしてください

于 2008-08-31T17:11:47.073 に答える
4

私がほとんどの作業を行ったデータベースでは、「Y」/「N」をブール値として使用していました。その実装を使用すると、次のようないくつかのトリックを実行できます。

  1. 真の行をカウントします:
    SELECT SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X

  2. 行をグループ化するときは、「1 つの行が真の場合、すべてが真」のロジックを適用します。
    SELECT MAX(BOOLEAN_FLAG) FROM Y
    逆に、MIN を使用して、1 つの行が偽の場合にグループ化を強制的に偽にします。

于 2008-08-27T13:36:23.533 に答える
1

私たちのデータベースでは、TRUE または FALSE のいずれかを確実に渡す列挙型を使用しています。最初の 2 つの方法のいずれかを行うと、適切な設計を行わずに整数に新しい意味を追加し始めるか、Y、y、N、n、T、t、 F、f の値と、コードのどのセクションがどのテーブルを使用しているか、どのバージョンの true を使用しているかを覚えておく必要があります。

于 2008-08-27T13:22:06.610 に答える