A user submitted a product search using the lowercase pattern crest%. The catalogue stores all product names in title case (e.g., Crest 13).
Write a query to return the name and price of any products that match the user's pattern as submitted.
Assumptions:
- The
productstable contains every product in Brightlane's catalogue. - All
Crest-line product names are stored with a capitalC; no name in the catalogue starts with a lowercasec. - Because the pattern is lowercase and every product name is title-case, no rows match the pattern; the result set is empty.
Output:
- One row per qualifying product, with columns
nameandprice. - The result set will be empty.
Schema · ecommerce 5 tables
Run previews · Check grades
Write a query, then run it to see results here.
Worked solution Try it yourself first
SELECT
name,
price
FROM
products
WHERE
name LIKE 'crest%' The shape
The correct query is the one that runs the user's pattern as written — LIKE 'crest%' — and returns the empty set, because LIKE is case-sensitive in PostgreSQL and no name in the catalogue starts with a lowercase c.
Clause by clause
SELECT name, pricereturns the two columns the search result would normally surface: the product name and its price. No rows match, so no values land in either column.FROM productsreads the catalogue.WHERE name LIKE 'crest%'keeps only the rows whosenamestarts with the literal textcrestfollowed by zero or more characters. The catalogue stores everyCrest-line product with a capitalC—Crest Pro 14",Crest Air, and so on — andLIKEcompares the pattern character-for-character with the column value. Lowercasecdoes not match uppercaseC, so every row is dropped beforeSELECTshapes the output.
Why this and not ILIKE 'crest%' or LIKE 'Crest%'
Both alternatives return rows. ILIKE 'crest%' ignores case, so it would match Crest Pro 14" and Crest Air. LIKE 'Crest%' corrects the pattern to title case and matches the same two products. Either would surface the line the user was probably trying to find.
Neither is what the prompt asks for. The task is to run the user's pattern as submitted — 'crest%' — and report what LIKE does with it. What LIKE does is fail to match, because PostgreSQL's default string comparison is byte-for-byte exact on case. The empty result set is the correct answer.
The trap
A user types a search in lowercase, the catalogue stores names in title case, and the LIKE filter returns no rows. There is no error, no warning, no hint that the case mismatch is the cause. The empty result looks the same as a genuine "no such product" result. An analyst running this query against real user input would assume the catalogue doesn't carry the line at all, when actually it does.
The fix is to choose case sensitivity deliberately. If user input should be forgiving, normalise the case — ILIKE is the one-line answer in PostgreSQL. If the search is meant to be strict, leave LIKE in place and document the rule so the empty result is read correctly. The decision is a product decision, not a SQL one; the SQL just executes whichever rule was picked.
You practiced relying on LIKE's default case sensitivity to produce a literal, no-match result. The recurring choice between LIKE and ILIKE is the difference between a strict search and a forgiving one.