OR widens filters; IS NULL checks NULL directly.

highlighted = computed this step

OR, NOT, and IS NULL

OR keeps a row if at least one child predicate is TRUE. IS NULL checks NULL directly.

OR / NOT / IS NULL\text{OR / NOT / IS NULL}

Read OR and NOT outputs

The OR filter keeps 2 rows. NOT IS NULL keeps 3 rows.

OR kept=2\text{OR kept}=2

WHERE-filter examples are tiny finite-table transforms with SQL-style TRUE/FALSE/UNKNOWN logic; SQL dialect completeness, type coercion, optimizer behavior, indexing, and product claims are out of scope.

OR combines truth values: base rowsitemqtystatuspen3opennotebook0openmug2closedstickerNULLopen predicate evaluationsourcevaluestruthkept0[pen, 3, open]TRUEyes1[notebook, 0, open]FALSEno2[mug, 2, closed]TRUEyes3[sticker, NULL, open]UNKNOWNno WHERE output rowsitemqtystatuspen3openmug2closed WHERE factsfactvalueinputRowCount4trueRows2falseRows1unknownRows1keptRows2droppedRows2rowOrdersource_orderunknownKeptno
NOT and IS NULL: base rowsitemqtystatuspen3opennotebook0openmug2closedstickerNULLopen predicate evaluationsourcevaluestruthkept0[pen, 3, open]TRUEyes1[notebook, 0, open]TRUEyes2[mug, 2, closed]TRUEyes3[sticker, NULL, open]FALSEno WHERE output rowsitemqtystatuspen3opennotebook0openmug2closed WHERE factsfactvalueinputRowCount4trueRows3falseRows1unknownRows0keptRows3droppedRows1rowOrdersource_orderunknownKeptno

IS NULL is direct

IS NULL returns TRUE for the NULL cell; NOT IS NULL flips that result.

NOT(IS NULL)\text{NOT(IS NULL)}

Summary

OR widens a filter; NOT flips TRUE and FALSE while leaving UNKNOWN unknown.

three-valued logic\text{three-valued logic}