Se vuoi ottenere una riga con due colonne quando ci sono due colonne non nulle e 1 se ce n'è solo una, devi creare dinamicamente la tua query.
Se vuoi avere sempre 1 colonna in cui ogni riga contiene un valore non nullo, puoi farlo con un'unione.
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 vuoi sapere da quali colonne provengono i valori, puoi fare qualcosa del genere:
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:l'unione rimuove anche i risultati duplicati. Se vuoi conservare i duplicati, usa UNION ALL
.