Tenho uma tabela de fatos que contém valores de licença médica para funcionários (Tabela 1) e preciso inserir cada valor em uma das faixas (Tabela 2)
O problema é que a tabela de fatos contém alguns valores negativos que representam bandas não numéricas. Esses valores são -6666,-7777,-8888,-9999 e não posso usar um operador between para eles porque eles também serão pegos na primeira banda na Tabela 2.
É possível usar uma instrução case para alterar o operador para esses valores? Algo assim:
SELECT * FROM SickLeave lv
INNER JOIN SickLeaveBands lb
ON
CASE WHEN lb.SickLeave in (-6666,-7777,-8888, -9999)
THEN lb.SickLeave = MinHours
ELSE lb.SickLeave BETWEEN MinHours AND MaxHours
END
Consegui contornar isso unindo usando uma consulta de união para o lado direito da junção, mas existe uma solução mais simples que também evite o uso de SQL dinâmico?
CASE
não é uma declaração, ele retorna uma expressão de valor, então não vai funcionar em uma situação onde você precisa de um resultado booleano lógico. Você pode simplesmente usarOR
em vez dissoDito isso, é provavelmente ineficiente usar tal
OR
condição, pois índices não podem ser usados corretamente. Você provavelmente deve mudar isso para algum tipo deUNION ALL
.Qualquer
Ou:
Case retorna uma expressão de valor, mas isso não significa que não possa ser usado nesse caso. Só precisa que ele retorne um valor que é então usado em uma comparação, como este: