Eu não quero escrever duas declarações como esta
if(filter_by_company) {
query..
} else {
query...
}
Portanto, selecione os usuários e eles estão em empresas e eu, o administrador, posso filtrar por ID da empresa. Como posso dizer que quando o filtro não existe, então não faça a condição?
SELECT * FROM users u
LEFT JOIN clients c
ON c.id = u.company_id
WHERE c.company_id = 'NAME' IF EXISTS ?? ELSE DONT ASK
como posso fazer isso?
Supondo que você esteja passando
company_id
como um parâmetro posicional, passe-o duas vezes seguidas (passenull
em sua linguagem de programação quando não o fizerfilter_by_company
):Se o seu cliente permitir parâmetros nomeados, você poderá usar:
ou alguma outra sintaxe de parâmetro equivalente.
O que acho que você está perguntando é como escrever uma consulta que possa lidar com a filtragem por empresa e não com a filtragem por empresa.
e
Existem duas abordagens. A primeira é tentar construir isso como uma consulta. A segunda é usar uma abordagem mais flexível para criar consultas.
Para fazer isso em uma consulta, você passaria um sinalizador booleano para determinar se deve ou não filtrar por empresa.
Demonstração .
Isto é aceitável para algo simples, mas esta técnica é muito limitada e leva a consultas desnecessariamente complexas.
Muito melhor é usar um construtor de consultas SQL para criar suas consultas. Então você pode escrever uma consulta genérica e adicionar cláusulas a ela. O que você usa depende da sua escolha de linguagens de programação, para estes exemplos usaremos Knex.js .
Primeiro, crie a consulta básica.
E adicione conforme necessário.
filter_user_by_client
é um novo objeto,user_client_query
não é afetado.A beleza desta técnica é que você pode adicionar limites, ordens, mais cláusulas where, mais junções e assim por diante.
E se adaptará aos dialetos SQL para você.
tente isso