28

ばかげた質問のようですが、それでも。私を騙しているのは私のIDEかもしれません。コードは次のとおりです(これはDbLinqから生成されます):

SELECT  pics$.Caption, pics$.Id, pics$.Path, pics$.Public, pics$.Active, portpics$.PortfolioID
FROM main.Pictures pics$
inner join main.PortfolioPictures portpics$    on  pics$.Id = portpics$.PictureId

WHERE   portpics$.PortfolioId = 1 AND pics$.Id > 0
--AND pics$.Active = 1 AND pics$.Public = 1
ORDER BY pics$.Id

このクエリを実行すると、ActiveとPublicという2つのブールフィールドを持つ3つの行が返されます。コメント化された行を追加しても、行は返されません。行を次のいずれかに変更します。

pics$.Active = 'TRUE'
pics$.Active = 't' 
pics$.Active =  boolean(1)

動作しません。エラーまたは結果なし。私はこれをグーグルで検索し、実際のSQLクエリが不足していることを発見しました。そして、ここにいます。

だから:SQLiteのwhere句でブールフィールドを使用するにはどうすればよいですか?

IDEはSQLite管理者です。

更新:まあ、私は答えを見つけました。SQLite Administratorを使用すると、明らかに独自のタイプを作成できます。生成されるSQLの作成は次のようになります。

CREATE TABLE [Pictures] ([Id] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[Path] VARCHAR(50)  UNIQUE NOT NULL,[Caption] varchAR(50)  NULL,
[Public] BOOLEAN DEFAULT '0' NOT NULL,[Active] BOOLEAN DEFAULT '1' NOT NULL)

クエリの修正は次のとおりです。

AND pics$.Active = 'Y' AND pics$.Public = 'Y'

ここでの本当の問題は、最初の回答者が指摘したように、SQLiteにはブール型がないことです。問題ではありませんが、注意すべき点があります。DbLinqを使用してデータレイヤーを生成しています。多分それはSQLiteがサポートしていないタイプのマッピングを許可するべきではありません。または、SQLiteにネイティブではないすべての型を文字列型にマップする必要があります。

4

4 に答える 4

24

where句でブール値を比較するために、比較演算子を使用する必要はありません。

「ブール値」列の名前が is_selectable の場合、where 句は次のようになります。 WHERE is_selectable

于 2012-07-26T19:26:46.557 に答える
22

SQLiteにはブール型がありません:SQLiteはどのデータ型をサポートしていますか?

コメントアウトされた行はそのまま機能するはずです。ブール値を表すには、データで1と0の整数値を使用するだけです。

于 2009-02-24T06:43:03.597 に答える
5

SQLiteにはブール型が組み込まれていません。代わりに整数を使用する必要があります。また、値を「TRUE」および「t」と比較する場合、ブール値や整数ではなく文字列としてこれらの値と比較するため、比較は常に失敗します。

ソース:http ://www.sqlite.org/datatype3.html

于 2009-02-24T06:43:29.367 に答える