eai pessoal, estava precisando recentemente de uma query dinâmica, tanto usando o OR quanto AND.
Fiz e vou compartilhar aqui caso alguém precise algum dia. (Ou até se alguém achar que dá pra melhorar também).
function buildConditions(params) {
let conditions = [];
if (typeof params.etnia !== 'undefined' && params.etnia !== '') {
conditions.push(`etnia IN (${params.etnia})`);
}
if (typeof params.genero !== 'undefined' && params.genero !== '') {
conditions.push(`genero = '${params.genero}'`);
}
if (typeof params.cabelo !== 'undefined' && params.cabelo !== '') {
conditions.push(`cabelo = '${params.cabelo}'`);
}
if (typeof params.altura !== 'undefined' && params.altura !== '') {
conditions.push(`altura = '${params.altura}'`);
}
if (typeof params.estado !== 'undefined' && params.estado !== '') {
conditions.push(`estado = '${params.estado}'`);
}
return {
where: conditions.length ?
conditions.join(' AND ') : '',
};
}
async function executeQuery(params) {
const conditions = buildConditions(params);
let sql = `SELECT * FROM algumaCoisa WHERE ${conditions.where}`;
//no meu caso sempre vai ter algo no Where, então vc tem que adaptar pra o seu uso.
console.log(sql)
}
Chamando essa function:
let params = {etnia: [`'negra'`, `'asiatica'`, `'branca'`], genero: 'masculino', cabelo: 'preto', altura: '', estado: 'São Paulo'}
executeQuery(params)
E o resultado:
SELECT * FROM algumaCoisa WHERE etnia = 'negra' OR etnia = 'asiatica' OR etnia = 'branca' AND genero = 'masculino' AND cabelo = 'preto' AND estado = 'São Paulo'
Sem o genero escolhido:
SELECT * FROM algumaCoisa WHERE etnia = 'negra' OR etnia = 'asiatica' OR etnia = 'branca' AND cabelo = 'preto' AND estado = 'São Paulo'
É isso, abraço!!