Consulta MySQL: pesquisar por linha e retornar o nome da coluna baseado no conteúdo da linha

Olá,
Tenho uma tabela com Informações True/False (Varchar), no estilo:
ID C1 C2
1 True True
2 True False
3 False True
4 False False

Gostaria de pesquisar a tabela toda, porém linha por linha (como em um laço for) o nome das colunas cujo conteúdo naquela linha seja “True”, sem determinar em qual coluna. Seria mais ou menos assim: na linha atual, que colunas contém o valor “True”? Próxima linha.
Por exemplo, eu queria que no caso dessa tabela exemplo ele me retornasse:
C1 C2
C1
C2

Alguém pode me ajudar a criar esse select?

Cara, você pode fazer assim:

SELECT
  IF(C1 = 'False', NULL, C1) as C1, -- Pode retornar NULL ou '', vc que sabe
  IF(C2 = 'False', NULL, C2) as C2
FROM
  tabela
WHERE
  C1 = 'True'
  or
  C2 = 'True';

Se alguém pensou em algo mais “elegante” que um IF, por favor, nos diga, hehe.

Se quiser pode substituir os IFs por:

  CASE C1 when 'False' then '' else C1 end,
  CASE C2 when 'False' then '' else C2 end

Nos dois casos é repassado o nome da coluna, eu não queria dizer o nome da coluna (na hora da execução não vou saber o nome), queria dizer “na linha 1, onde tem ‘true’, me passe o nome das colunas correspondentes (porque não sei quais são!)”

Não vejo uma forma de fazer isso numa query dinamica… melhor você pensar numa solução com uma function no banco. Você vai ter que buscar no seu schema as colunas da tablela que você quer, validar os tipos e verificar os valores.

Ou talvez se não forem muitos dados, pode trazer tudo e processar no java mesmo:

String sql = "select * from tabela";
List<String> colunasQuePossuemValorTrue = new ArrayList<String>();
ResultSet rs = con.prepareStatement(sql).executeQuery();
ResultSetMetaData meta = rs.getMetaData();
while(rs.next()){
      for(int i = 0; i < meta.getColumnCount(); i++){
             String valor = rs.getString(i);
             String nomeDaColuna = meta.getColumnLabel(i);
             if(valor.equals("true")){
                   //essa coluna contem valor true, guarda o nome dela
                   colunasQuePossuemValorTrue.add(nomeDaColuna);
             }
       }
}
rs.close();
//sua lista colunasQuePossuemValorTrue contem os nomes das colunas que possuem valor = 'true'

att

Gustavo, sua solução foi muito boa… Não sei porque foquei somente em soluções sql, fiquei com isso na cabeça. Excelente!