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
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.
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'