0

6,169 のテーブル users があります。これらのユーザーの一部は、「ステータス」という名前の列で期限切れのユーザーとしてマークされ、残りのユーザーはこの列の値が NULL になります。まだアクティブなすべてのユーザーの「ステータス」列を値「アクティブ」で更新しようとしていますが、更新するグループを正確に選択するのに問題があります。

私が走るとき

SELECT COUNT(id) FROM users;

6,169 人のユーザー数が確認されています。

私が走るとき

SELECT COUNT(id) FROM users WHERE status='expired'

期限切れのユーザーが 2,500 人確認されています。ただし、実行すると

SELECT COUNT(id) FROM users WHERE status !='expired'

カウント0を取得します。同様のバリエーションを試しました

SELECT COUNT(id) FROM users WHERE NOT status='expired'

他の多くの StackOverflow の質問を調べましたが、構文が正しくない理由がわかりません。どんな助けでも大歓迎です!

4

5 に答える 5

2

Status はおそらく NULL 可能な列であり、NULL != 'expired'true になることはありません。

これを試すことができます:

SELECT COUNT(id) FROM users WHERE status IS NULL

3696 が返されます。fiddle here を参照してください

于 2013-08-06T20:49:20.073 に答える
1

質問で述べたように、status列はNULL値を取ります。値に対する比較 ( を除くis null) は、NULLを返しますNULL。そして、NULLは偽であると見なされます。ロジックに役立つため、「欠落」ではなく「不明」と考えることができます。

あなたが発見したように、NULL値はこれらすべてに失敗します:

where status = 'expired'
where status <> 'expired'
where not status = 'expired'
where not status <> 'expired'
where status = NULL
where status != NULL

覚えておいてください: 比較はNULLであり、「false」ではありません。したがって、「NOT NULL」はまだ NULL です (不明なブール値がまだ不明ではないため)。対照的に、「偽ではない」は真になります。

合格する唯一の直接比較は次のとおりです。

where status is NULL

アクティブを取得するには、次のようにします。

SELECT COUNT(id)
FROM users
WHERE status <> 'expired' or status is NULL

または、代わりに次を使用しますcoalesce()

SELECT COUNT(id)
FROM users
WHERE coalesce(status, 'active') <> 'expired';

後者の方が読みやすいです。以前のバージョンでは、インデックスが利用可能な場合、インデックスを使用する可能性が高くなります。

于 2013-08-06T21:03:44.693 に答える
0

期限切れのユーザーをすべて選択....

SELECT COUNT(id) FROM users WHERE status = 'expired'

すべてのアクティブなユーザーを選択...

SELECT COUNT(id) FROM users WHERE status IS NULL;
于 2013-08-06T20:50:22.330 に答える
0

あなたはそのように逆にすることができます

SELECT COUNT(id) FROM users 
WHERE id not in (SELECT id FROM users WHERE status='expired')
于 2013-08-06T20:52:13.897 に答える
0

おそらく試してみてください

SELECT COUNT(id) FROM users WHERE status NOT IN ('expired')

また

SELECT COUNT(id) FROM users WHERE status <> 'expired'

代わりは?通常、列が数値の場合はこれらを行いますが、文字列値で機能するかどうかはわかりません。

于 2013-08-06T20:53:00.300 に答える