2つの列v
とw
を一緒に追加すると、一方または両方の被加数がNULL
の場合、行の結果はNULL
になります。意味あり。しかし、私がSUM(v)
の列を合計すると、NULL
であっても数字の結果が出ます。これは実用的な喜びですか?それとも理論的正当性があるのでしょうか?ここ列の追加とNULL値の列の合計の間のSQLの不一致
は(MySQLとSQLiteの)を明確にする例である:
CREATE TABLE x0 (
id INTEGER
, v DOUBLE
, w DOUBLE
);
INSERT INTO x0 VALUES
(1, 1, 1)
, (2, 1, 1)
, (3, NULL, 1)
, (4, 1, NULL)
, (5, NULL, NULL)
;
-- NULL if summand is NULL
SELECT v+w
FROM x0
;
-- v+w
-- 2
-- 2
-- \N
-- \N
-- \N
-- NULL if summand is NULL
SELECT id, v+w, SUM(v+w)
FROM x0
GROUP BY id
;
-- id v+w SUM(v+w)
-- 1 2 2
-- 2 2 2
-- 3 \N \N
-- 4 \N \N
-- 5 \N \N
-- There is numeric results even if some summands are NULL
SELECT SUM(v), SUM(w)
FROM x0
;
-- SUM(v) SUM(w)
-- 3 3
SQLは、健全で一貫した理論上の基礎を持っていません。その標準がどのように操作を定義しているかを受け入れるだけです。 「理論的に」、「NULL」値が不定であるため、いずれかの引数が「NULL」である場合、値は「NULL」でなければならない。 –
@ GordonLinoff SQLは集合理論に基づいていると私は考えました。したがって、妥当性のために、いくつかのケースでは、例えば、「SUM」のような関数を使用して、数学的な徹底を残すように思われる。 – giordano
標準SQLは、集計関数内のNULLを単純に無視/削除します。さもなければ、 'MIN(COALESCE(mycolumn、9999999)'のようなNULL可能な列にCOALESCEを使う必要があります。返された9999999が実際に最小値かNULL置換かどうかを知るのは難しいです。 – dnoeth