CASE + CTEs
Aaa que beleza, Sexta-feira… o dia começa melhor… todo mundo feliz… porque será?
Mas vamos lá… aproveitando o embalo que no último post falei sobre o CASE, vou dar outra dica.
Por ex:
CREATE FUNCTION dbo.fn_Situacao(ID Integer)
RETURNS TABLE
AS
RETURN (SELECT Col1,
Col2
CASE dbo.fn_SuperUltraFunctionRetornaTudo(@ID) WHEN ‘S’ THEN 1 ELSE –1 END as Status1,
CASE dbo.fn_SuperUltraFunctionRetornaTudo(@ID) WHEN ‘N’ THEN 0 ELSE –1 END as Status2
FROM Tab1
WHERE ID = @ID)
Repare que a function fn_SuperUltraFunctionRetornaTudo esta sendo utilizada duas vezes para o mesmo ID, ou seja tem um certo desperdício ai concorda? Se eu conseguir fazer com que a chamada desta function seja única, vou ganhar tempo… para isso podemos fazer o seguinte:
CREATE FUNCTION dbo.fn_Situacao(ID Integer)
RETURNS TABLE
AS
RETURN (WITH Temp_CTE (Situacao)
AS
(
SELECT dbo.fn_SuperUltraFunctionRetornaTudo(@ID)
)
SELECT Col1,
Col2
CASE Temp_CTE.Situacao WHEN ‘S’ THEN 1 ELSE –1 END as Status1,
CASE Temp_CTE.Situacao WHEN ‘N’ THEN 0 ELSE –1 END as Status2
FROM Tab1
CROSS JOIN Temp_CTE
WHERE ID = @ID)
Feito, usando a CTE eu tiro a duplicidade. Isso pode salvar seu dia…