34

これは奇妙なものです:

NOT NULLSSQLiteからフィルタリングすることはできますが、できませんNULLS

これは機能します:

SELECT * FROM project WHERE parent_id NOT NULL;

これらはしません:

SELECT * FROM project WHERE parent_id IS NULL; 
SELECT * FROM project WHERE parent_id ISNULL; 
SELECT * FROM project WHERE parent_id NULL;

すべての返品:

クエリの構文に問題があります(クエリは実行されませんでした)...

更新

私はこれをPHPで行っています-ezSQlを使用したコードと、PHPLiteAdminインターフェイスを使用しています

PHPLiteAdminデモを使用すると、この式は機能します。これで、PHPのSQLiteのバージョンの問題が疑われますか?それでいいの?この表現はいつも有効ではなかったのですか?

更新2

ezSQLを使用してPHPからコードを実行すると、PHPの警告は次のようになります。

PHP警告:SQLロジックエラーまたはデータベースがありません

PHPからより多くの情報を取得する方法はありますか?これは、特にCLIの同じステートメントが正常に機能するため、非常に不透明で奇妙です...

更新3

私が持っている他の唯一の考えられる手がかりは、PHPで作成したデータベースをCLIで読み取ることができないこと、およびその逆であるということです。私は得る:

エラー:ファイルが暗号化されているか、データベースではありません

したがって、ここには間違いなく2つのSQliteフレーバーがあります。(これを参照してください)それでも、なぜ無効なステートメント??

更新4

理由ではないにしても、問題の原因を突き止めたと思います。PHPezSQLで作成したDBは、ISNULLステートメントが失敗するDBです。PHPのSQLite3クラスを使用してDBを作成すると、ステートメントは正常に機能し、さらに、CLIからDBにアクセスできますが、ezSQLで作成されたDBはfile is encryptedエラーを出しました。

そこで、ezSQLコードを少し掘り下げました。すぐに、新しいSQLite3クラスではなく、PDOメソッドを使用していることがわかります。多分それは何かです-私はそれにそれ以上の時間を無駄にするつもりはありません...

いずれにせよ、私はezSQLを避け、PHPのSQLite3クラスを使用するという私の解決策を見つけました。

4

6 に答える 6

48

a IS bandは、 andが式a IS NOT bである一般的な形式です。ab

これは通常、a IS NULLand のa IS NOT NULL場合にのみ見られます。それぞれ前の式の短縮形であるISNULLand NOTNULL(また) 演算子もあります (これらは 1 つのオペランドのみを受け取ります)。NOT NULL

SQLite 式で理解される SQL は、SQLite Query Language: Expressionsでカバーされています。

;CLI を使用している場合は、(前の) ステートメントが最初のステートメントで終了していることを確認してください。

これらはすべて、「null 一致」を否定するために有効です。

expr NOT NULL
expr NOTNULL
expr IS NOT NULL

これらはすべて「null に一致」するのに有効です。

expr ISNULL
expr IS NULL

上記の構造はすべてそれ自体が式であるため、否定も有効です (たとえばNOT (expr NOT NULL)、 は と同等ですexpr IS NULL)。

ハッピーコーディング。


プリンの証拠:

SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table x (y int null);
sqlite> select * from x where y isnull;
sqlite> select * from x where y notnull;
sqlite> select * from x where y not null;
sqlite> select * from x where y is null;
sqlite> select * from x where y is not null;
sqlite>
于 2011-09-22T18:32:37.170 に答える
8

この問題は、SQLiteが空の列を処理する方法に起因する可能性があります。たとえば、列が空であるからといって、それがNULLであることを意味するわけではありません。「」に対してテストしましたか?

SELECT * FROM project WHERE parent_id = ""

そのクエリは結果を返す可能性があります。

于 2011-11-09T00:56:05.777 に答える
6

Android SQLite では、フィールド IS NULL も機能しません。

field = 'null'です。あなたの環境で試してみてください

于 2012-10-05T23:40:34.577 に答える
2

これは、Firefox の SQLite Manager の SQLite で機能します。

          select * from foo where not baz is not null

上記のクエリは、列 [baz] が null の行を返します。:-) ヤリン、多分それはあなたのために働くでしょうか? (列名の前の「not」はタイプミスではありません)。

このクエリも、baz が null である行を検索します。

         select * from foo where [baz]  is  null
于 2011-09-22T19:59:37.080 に答える
0

おそらく PK 列 (?) をテストしていて、その列が行 ID のシノニムとして扱われている場合、NULL の行 ID を持つ行はありません。

于 2011-09-22T20:08:21.800 に答える
-2

your_col_name ISNULL where ISNULL にスペースが含まれていない場所を試してください

于 2014-12-25T06:31:34.617 に答える