Data Cleaning Patterns
Fill Missing Values
Use COALESCE
COALESCE replaces NULLs with the first available fallback value.
Program
Play the script to choose a default city for rows with missing profile data.
fill_missing_values.sql
Replay: real traced execution (multi-file project)
CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);
INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);
WITH params(default_city) AS (VALUES ('Unknown')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;
CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);
INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);
WITH params(default_city) AS (VALUES ('Remote')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;
CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);
INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);
WITH params(default_city) AS (VALUES ('Unassigned')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;
tables ← 1 row
1CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);values this step1 rowtablesprofiles ← 3 rows
1CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);3WITH params(default_city) AS (VALUES ('Unknown')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;values this step3 rowsprofilesresult ← 3 rows
2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);3WITH params(default_city) AS (VALUES ('Unknown')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;values this step3 rowsresult
tables ← 1 row
1CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);values this step1 rowtablesprofiles ← 3 rows
1CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);3WITH params(default_city) AS (VALUES ('Remote')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;values this step3 rowsprofilesresult ← 3 rows
2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);3WITH params(default_city) AS (VALUES ('Remote')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;values this step3 rowsresult
tables ← 1 row
1CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);values this step1 rowtablesprofiles ← 3 rows
1CREATE TABLE profiles (name TEXT, city TEXT, visits INTEGER);2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);3WITH params(default_city) AS (VALUES ('Unassigned')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;values this step3 rowsprofilesresult ← 3 rows
2INSERT INTO profiles VALUES ('Ada', 'Austin', 3), ('Lin', NULL, 2), ('Nia', NULL, 5);3WITH params(default_city) AS (VALUES ('Unassigned')) SELECT name, COALESCE(city, (SELECT default_city FROM params)) AS clean_city, visits FROM profiles ORDER BY name;values this step3 rowsresult
COALESCE
`COALESCE(city, fallback)` returns `city` unless it is NULL.
missing value
NULL means the value is unknown, not an empty string.
default value
The selector changes the fill value used for missing cities.