Yes! Yet another SQL post (sigh).
It is occasionally desirable to perform a SELECT that should show a row even when the primary table does not have a row that meets the selection criteria.
For example
SELECT CASE
WHEN c.name IS NULL THEN 'No suspects found'
ELSE 'Suspect:'
END
, c.Name
, c.Height
, c.EyeColour
, c.ModusOperandi
FROM Criminals c
LEFT OUTER JOIN prisoners p
ON p.id = c.id
WHERE c.ModusOperandi LIKE '%' + @crimeFact + '%'
AND p.prison IS NULL;
should show No suspects found when @crimeFact = 'left selfie at scene'. But instead it displays no row at all.
To get the desired result, join each row to a row that will always exist – one you create yourself:
SELECT CASE
WHEN c.name IS NULL THEN 'No suspects found'
ELSE 'Suspect:'
END
, c.Name
, c.Height
, c.EyeColour
, c.ModusOperandi
FROM Criminals c
LEFT OUTER JOIN prisoners p
ON p.id = c.id
RIGHT JOIN (SELECT 1 constant) AS dummy
ON p.ModusOperandi LIKE '%' + @crimeFact + '%'
AND p.prison IS NULL;
Note: the terms of the WHERE clause are moved into the ON clause for the dummy record.
Our search will now properly return a row with No suspects found in the first column and NULL in the other 4 columns.