3

アクティブなレコードを使用して、CodeIgniter を実行しています。以下は私のテーブル構造です:

id (int)   user (int)   is_complete (tinyint)
------------------------------------------------
1          24           1
2          24           1
3          24           NULL
4          24           0
5          24           0

ケース1

$this->db->where('user', 24);

クエリ:

SELECT * FROM `table` WHERE `user` = 24

作品と返品:

id   user   is_complete
--------------------------
1    24     1
2    24     1
3    24     NULL
4    24     0
5    24     0

ケース 2

$this->db->where('user', 24);
$this->db->where('is_complete', 1);

クエリ:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` = 1

作品と返品:

id   user   is_complete
--------------------------
1    24     1
2    24     1

ケース 3

$this->db->where('user', 24);
$this->db->where('is_complete !=', 1);

クエリ:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` != 1

動作せず、戻ってきます:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

ケース 4

$this->db->where('user', 24);
$this->db->where('is_complete <>', 1);

クエリ:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` <> 1

動作せず、戻ってきます:

id   user   is_complete
--------------------------
4    24     0
5    24     0 

必要な結果

次のように返されます

id   user   is_complete
--------------------------
3    24     NULL
4    24     0
5    24     0

メソッドを使用して何か間違ったことをしていますかwhere()、それともこれを達成するためのより良い方法はありますか?

4

3 に答える 3

6

これはバグではありませんが、データベース レベルの問題です。これは、SQL が null 値を処理する方法です。このクエリ:

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND `is_complete` != 1

is_completeが1 ではなく、nullではないレコードを返します。null レコードも含めたい場合は、次のようにする必要があります。

SELECT
    *
FROM
    `table`
WHERE
    `user` = 24 AND
    (`is_complete` != 1 OR `is_complete` IS NULL)

列を null 以外の値と比較することで、別の構文で処理する必要がある null が自動的に除外されます。

追加の角かっこで囲まれた句をクエリに追加する必要があります。方法については、こちらを参照してください

于 2013-09-12T19:27:28.480 に答える
1

ケース 3 は機能しています。NULLSQL では数値と​​は異なり、別のコンパレータが必要です。私の考えでは、NULL は何もないことであり、0 は数字の 0 です。それは微妙な違いです。したがって!= 1、1 以外のすべての数値が得られますが、null を見つけるにはis/is not nullコンパレータを使用する必要があります。

必要な結果を見つけるためのクエリは次のとおりです。

$this->db->where("((is_complete = 0) OR (is_complete is null))",NULL,FALSE);

を検索すること!= 1は、を検索することと同じではありません= 0。(可能な場合is_completeは、'3' という値があります。存在しないものではなく、必要なものを検索すると、コード内の問題が少なくなる可能性があります)。

バッククォートを削除する 3 番目のwhere(FALSE) パラメータが使用されている場合、ステートメントは 2 番目のパラメータを必要とします。

于 2013-09-22T03:20:03.850 に答える