76

boolean 列の型については知っていますが、SQLiteにboolean リテラルはありますか?他の言語では、これはまたはである可能性がありtrueますfalse。もちろん、とを使用することはできます01、可能な限り、いわゆる「マジックナンバー」を避ける傾向があります。

このリストから、他のSQL実装には存在する可能性がありますが、SQLiteには存在しないようです。(私はSQLite 3.6.10を使用していますが、その価値はあります。)

4

12 に答える 12

97

セクション1.1ドキュメントのブールデータ型から:

SQLiteには個別のブール型ストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。

0だから、あなたはとで立ち往生しているように見えます1

于 2010-03-24T19:08:52.970 に答える
26

SQLiteにブールリテラルはありますか?

Justin Ethierの回答で述べられているように、SQLiteにはブール値の特定のデータ型はありません。しかし、SQLite 3.23.0以降では、true/falseリテラルをサポートしています。

  1. TRUEとFALSEを定数として認識します。(互換性のために、「true」または「false」という名前の列が存在する場合、識別子はブール定数ではなく列を参照します。)

  2. サポート演算子は、TRUE、FALSE、TRUEではなく、FALSEではありません。

SELECT true AS t, false AS f;

SELECT 'condition is true'
WHERE 1 IS NOT FALSE;

CREATE TABLE a (id INT, b BOOLEAN DEFAULT(TRUE));
INSERT INTO a(id) VALUES(100);
SELECT * FROM a;
-- id  b
-- 100 1

SELECT * FROM a WHERE true;
-- id  b
-- 100 1

dbfiddle.comデモ

于 2019-01-16T18:58:12.083 に答える
8

1.1ブールデータ型

SQLiteには個別のブール型ストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。

ドキュメント

于 2010-03-24T19:07:51.647 に答える
8

問題は、明示的に列タイプ(つまり、ストレージ単位)ではなく、PostgreSQLキーワードのドキュメント(SQL-92、SQLも含まれる)に従ってSQLに準拠するリテラル(つまり、パーサー単位)TRUEの使用に関するものです。 :参照テーブルの2008およびSQL:2011列)。FALSE

SQLiteのドキュメントには、サポートされているすべてのキーワードがリストされています。このリストには、もも含まれていませTRUEFALSE。したがって、SQLiteは、残念ながらその点で非準拠です。

また、簡単にテストして、トークンを列名にするためにパーサーがどのようにバーフするかを確認することもできます。

$ sqlite3 :memory:
SQLite version 3.14.0 2016-07-26 15:17:14
sqlite> CREATE TABLE foo (booleanish INT);
sqlite> INSERT INTO foo (booleanish) VALUES (TRUE);
Error: no such column: TRUE
于 2017-03-01T16:27:07.660 に答える
3

他の誰もが指摘しているように、SQLiteは特定のブールストレージタイプをサポートしておらず、OPはこの事実を明確に認めています。ただし、これはSQLiteがブールリテラルと内包表記をサポートするかどうかとは完全に独立しています。

疑問に思っている人にとっては、答えは「はい」です。SQLite3.23以降、ブールリテラルTRUEとを使用してブール値を理解できFALSE、期待どおりに機能します。

たとえば、次のことができます。

SELECT * FROM blah WHERE some_column IS FALSE;

SELECT * FROM blah WHERE some_column IS TRUE;

0そして、falseとtrueを使用している場合、期待どおりに機能1します。

私のテストから、SQLiteがさまざまな値に一致する方法は次のとおりです。

  • ゼロ以外のNUMERIC、INTEGER、またはREAL:IS TRUE
  • NUMERIC、INTEGER、またはREALがゼロの場合:IS FALSE
  • null値:IS NULL。またはと一致しませIS TRUEIS FALSE
  • IS FALSE数値に解析されないTEXT:。「t」、「TRUE」、「true」、「True」などの値でも一致しますIS FALSE
  • 数字のように見えるテキスト(例:「0」、「1」、「5」):上記のNUMERICのように動作します。
  • BLOB:テストされていません。
于 2020-11-10T06:43:55.890 に答える
0

ブールデータ型はありません。ここにリストされているのは5つのタイプだけです。整数は、さまざまな幅でディスクに格納できます。最小値は1バイトです。ただし、これは実装の詳細です。

「しかし、INTEGER値がディスクから読み取られて処理のためにメモリに読み込まれるとすぐに、それらは最も一般的なデータ型(8バイトの符号付き整数)に変換されます。」

それを考えると、ブールリテラルがないことは驚くべきことではありません。

于 2010-03-24T19:09:06.660 に答える
0

BOOLEANテーブルを作成するときに使用できます。

sqlite3 :memory:
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> CREATE TABLE test (mybool BOOLEAN);

ただし、これは実際のデータ型ではなく、テーブルのSQL記述には次のようなものがあります。

"mybool" BOOLEAN NOT NULL CHECK(mybool IN(0,1))

基本的に、値が0または1であるSQL制約制約を作成します。したがって、TRUE / FALSEを使用すると、エラーが発生します。

sqlite> INSERT INTO test(mybool) VALUES (TRUE);
Error: no such column: TRUE

したがって、キーワードを使用できますがBOOLEAN、「実際の」データ型ではないため、0/1を使用する必要があります。

sqlalchemyを使用する場合、データ型BOOLEANを問題なく使用できます。

于 2019-09-10T12:44:26.140 に答える
-1

SQLite3でサポートされているデータ型は5つだけです。

公式SQLite3ドキュメントから。「SQLiteデータベースに保存されている(またはデータベースエンジンによって操作されている)各値には、次のいずれかのストレージクラスがあります。

NULL. The value is a NULL value.

INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value."

1と0を保存する場合、SQLiteは保存時に1バイトを使用します。悪くないです。公式ドキュメントリンク:-http://www.sqlite.org/datatype3.html

于 2014-12-17T06:59:57.657 に答える
-1

sqlite for androidで、エラーなしでブール列型を宣言でき、正常に機能しているようです。また、列を「int」として定義し、Javaブール値を格納してみました。dbをダウンロードして、列に「true」と書いていることを確認しました。私はそれがうまくいくと思います。

于 2015-06-24T19:48:03.997 に答える
-1

ここに示すように、SQLiteにはTRUEとFALSEのリテラルがあります:

https://www.sqlite.org/syntax/literal-value.html

(ええ、応答するのに長い時間がかかります:)

于 2019-10-30T14:20:30.510 に答える
-2

SQLiteにはブール型がないため、INTEGERを使用する必要があります。0はfalse、1はtrueです。

于 2017-10-08T14:09:29.053 に答える
-3

BOOLEAN-> NUMERIC(アフィニティ)

カラムアフィニティ

SQLiteは、列の型アフィニティの概念をサポートしています。どの列でも任意のタイプのデータを格納できますが、列に推奨されるストレージクラスはアフィニティと呼ばれます。SQLite3データベースの各テーブル列には、次のタイプのアフィニティのいずれかが割り当てられます。アフィニティの説明

  • TEXTこの列は、ストレージクラスNULL、TEXT、またはBLOBを使用してすべてのデータを格納します。
  • NUMERICこの列には、5つのストレージクラスすべてを使用する値が含まれる場合があります。
  • INTEGER CAST式の例外を除いて、NUMERICアフィニティを持つ列と同じように動作します。
  • REAL整数値を浮動小数点表現に強制することを除いて、NUMERICアフィニティを持つ列のように動作します
  • NONEアフィニティNONEの列は、あるストレージクラスを別のストレージクラスよりも優先せず、あるストレージクラスから別のストレージクラスにデータを強制変換する試みは行われません。

ブールデータ型:

SQLiteには個別のブール型ストレージクラスはありません。代わりに、ブール値は整数0(false)および1(true)として格納されます。

@ moiing-duck 「反対に、SQLiteはこれらの5つのタイプのいずれでもないにもかかわらず、日時をサポートしているため、この答えは決定的ではありません。」

SQLiteには、日付や時刻を保存するためのストレージクラスがありません。代わりに、SQLiteの組み込みの日付と時刻関数は、日付と時刻をTEXT、REAL、またはINTEGER値として格納できます。

于 2015-04-22T01:22:31.367 に答える