Se você quiser obter uma linha com duas colunas quando houver duas colunas não nulas e 1 se houver apenas uma, será necessário criar sua consulta dinamicamente.
Se você quiser sempre ter 1 coluna onde cada linha contém um valor não nulo, você pode fazer isso com uma união.
SELECT a FROM tbl WHERE a IS NOT NULL AND id = ?
UNION
SELECT b FROM tbl WHERE b IS NOT NULL AND id = ?
UNION
SELECT c FROM tbl WHERE c IS NOT NULL AND id = ?
Se você quiser saber de quais colunas os valores vêm, você pode fazer algo assim:
SELECT 'col a' AS ColName, a FROM tbl WHERE a IS NOT NULL AND id = ?
UNION
SELECT 'col b', b FROM tbl WHERE b IS NOT NULL AND id = ?
UNION
SELECT 'col c', c FROM tbl WHERE c IS NOT NULL AND id = ?
Nota:a união também remove resultados duplicados. Se você quiser manter duplicatas, use
UNION ALL
.