Mode disclosure
All modes use one coherent workspace; only disclosure and guidance change. Learn mode keeps theory, concept names, full schema help, progressive hints, and solution review available.
NULL and Three-Valued Logic / write query
M09-A03 - Write - return rows whose optional value is known
M09-A03 - Write - return rows whose optional value is known. Reason about missing information with IS NULL and unknown Boolean results.
- Result grain
- one customer row with a known optional loyalty tier
- Exact columns
- customer_id; customer_name; loyalty_tier
SQL editor shortcuts: Ctrl or Command Enter runs the query, Ctrl or Command Shift Enter checks it, Alt H opens the next hint, Ctrl or Command slash toggles a line comment, Ctrl or Command Shift F formats the SQL, and Escape closes transient UI.
Cursor at line 1, column 1.
Scenario
Reason about missing information deliberately: compare NULL with IS predicates, classify UNKNOWN separately, and keep empty strings, zeroes, and false booleans distinct from absence.
NULL and Three-Valued Logic / write query
One-sentence task
M09-A03 - Write - return rows whose optional value is known. Reason about missing information with IS NULL and unknown Boolean results.
Learn mode disclosure
Theory, concept names, full schema help, and progressive hints are available.
Structured output contract
- Result grain
- one customer row with a known optional loyalty tier
- Exact columns
- customer_id; customer_name; loyalty_tier
- Source population
- Use the prompt setup plus FROM, JOIN, WHERE, and subquery predicates as the source population. Visible rows are only examples.
- Grouping
- Do not collapse rows unless the contract explicitly asks for aggregation, distinct tuples, or set semantics.
- Ordering
- order by customer_id
- Validation
- select-only; hidden deterministic variants.
Relevant tables
Time and difficulty
- Estimated time
- 6 minutes
- Difficulty
- 2/5
Objective and concepts
State the requested SQL output contract for null and three-valued logic using source grain, columns, ordering, and edge-case evidence.
Glossary links
Concept material
SQL Trail treats every query as an evidence trail: identify source grain, transform rows deliberately, then compare output to a shared contract.
A passing query must handle hidden nulls, ties, boundaries, and no-match rows when the contract makes them relevant.
Syntax card
SELECT <requested_columns>
FROM <source_table>
WHERE <source_population_filter>
GROUP BY <result_grain_columns>
ORDER BY <deterministic_tie_breakers>;- <requested_columns> means the exact output columns, aliases, and order from the visible contract.
- <source_population_filter> means the row population definition, not a copied visible-row value.
- <deterministic_tie_breakers> means all ordering and tie rules needed for repeatable output.
Why this works
A comparison to NULL does not produce true or false; IS NULL is the predicate that detects missing values.
Edge cases
Hidden variants preserve nulls, ties, duplicates, boundaries, no-match rows, and alternate row order when those risks apply.
PostgreSQL note
The local engine uses PostgreSQL-compatible syntax, including explicit NULL predicates, deterministic ORDER BY clauses, and transactional grading.
Worked example
SELECT customer_id, loyalty_tier, (loyalty_tier = NULL) AS equals_null_result, (loyalty_tier IS NULL) AS is_null_result FROM customers ORDER BY customer_id;Assumptions, dialect notes, and common traps
- Duplicate policy
- Preserve duplicate facts unless the prompt explicitly asks for distinct tuples or set semantics.
- Null policy
- Preserve NULL, empty string, zero, and false as distinct values unless the contract says to display a fallback.
- Tie-breakers
- Use every ordering rule in the contract and end tied business metrics with deterministic secondary keys when needed.
- Zero-related entities
- Do not invent zero rows unless the contract asks for preserved parents, missing entities, or complete periods.
- Numeric tolerance
- Use exact semantic comparison unless the activity explicitly declares a numeric tolerance.
PostgreSQL-compatible local checks
Queries run in a local PGlite worker with PostgreSQL-style syntax and transactional grading.
- NULL is not a comparable value: A missing value is tested with equals or not equals and no rows behave as expected. Repair: Use IS NULL for missing values and IS NOT NULL for known values.
- UNKNOWN is not false: Rows with NULL comparisons are treated as if the comparison returned ordinary false. Repair: Classify TRUE, FALSE, and UNKNOWN separately before deciding which rows survive a WHERE clause.
- Fallback display is not filtering: COALESCE is used to show a label and assumed to have selected missing rows. Repair: Filter with IS NULL or IS NOT NULL, then use COALESCE only when the output should display a fallback.
- Empty zero and false are still values: Empty text, zero counts, or false booleans are treated as missing information. Repair: Keep NULL separate from empty strings, whitespace, zero, and false unless the contract explicitly normalizes them.
Opened hints
No hints opened yet.