0

MySQL で 3 つの SQL クエリを実行しましたが、論理的な問題があります。

select count(*) from keeper where code!=''; -- result1=2893193
select count(*) from keeper where code=''; -- result2=66
select count(*) from keeper; -- result3=3481069

と思っていたresult1 + result2 = result3のですが、実はresult1 + result2 < result3。どうしてこれなの?

4

4 に答える 4

3

に加えてIS NOT NULLANDを使用すると、すでに探しているように両方とも空であるか、列が NULL に設定されているすべての行を確実に取得できます。IS NULL=''

SELECT count(*) FROM keeper WHERE code!='' OR code IS NOT NULL;
SELECT count(*) FROM keeper WHERE code = '' OR code IS NULL
于 2012-04-08T04:56:38.710 に答える
0

三値論理攻撃!

NULL と "" は 2 つの異なるものです。NULL は、等しくも等しくないとも見なされない""ため、どちらのクエリもそれを返すことはありません。code3 番目のクエリで返された余分な 500,000 レコードが NULLに設定されていると思います。IS NULLまたはを使用して null フィールドをテストできますIS NOT NULL。もしあなたがそうするなら:

SELECT count(*) from keeper where code!='';
SELECT count(*) from keeper where code='';
SELECT count(*) from keeper where code IS NULL;

これら 3 つの結果を合計すると、テーブル内の行の合計数になります。

于 2012-04-08T04:58:56.047 に答える
0
1.   select count(*) from keeper where code!=''
2.   select count(*) from keeper where code=''
2.5. select count(*) from keeper where code is null
3.   select count(*) from keeper

の前に挿入されたものに注意してください3。NULL は、他の値 (別の NULL を含む) と等しくなくても等しくなくても、他の値とは別のケースと見なされます。

于 2012-04-08T05:00:01.110 に答える
0

常にIS NuLLansIS NOT NULLを使用して、正確な空のレコードと空でないレコードをそれぞれ取得します。空の値と null 値の両方をチェックします。

以下を試してください:

select count(*) from keeper where code is NULL;

select count(*) from keeper where code is NOT NULL

または、次を使用できます。

select  count(*) from keeper where LENGTH(COALESCE(code ,'')) = 0

NULL を空として扱い、 code の値が「空」のすべてのレコードを取得します。

于 2012-04-08T04:55:20.517 に答える