Segue um script para simular uso da função DECODE do SGBDR Oracle, nesta function, adaptei para situação em que o valor for zero,
por exemplo uma situação em que tem que dividir um valor por zero.
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[usf_decode_zero]')
AND type IN (N'FN')
)
DROP FUNCTION usf_decode_zero;
GO
CREATE FUNCTION usf_decode_zero(@param1 float, @param2 float) RETURNS float AS
-- Nome Artefato/Programa..: usf_decode_zero.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com)
-- Data Inicio ............: 28/06/2012
-- Data Atualizacao........: 28/06/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL)
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) verifica se o valor do primeiro parametro é igual a zero, retornando o valor do
-- ........................: segundo parametro2, semalhante a função decode do Oracle, porém simplificado.
-- OBS.....................: O primeiro parametro é um float, retorna o valor do segundo parametro que também é flaot, caso o primeiro
-- ........................: parametro seja igual a zero, caso contrário retorna o valor do primeiro parametro.
-- ........................:
--
BEGIN
RETURN
(
SELECT CASE WHEN @param1 = 0 THEN
@param2
ELSE
@param1
END AS usf_decode_zero
)
END;
GO
-- exemplo do uso da function
SELECT dbo.usf_decode_zero (0,1200); --Retorno: 1200
SELECT dbo.usf_decode_zero (1100,1); --Retorno: 1100
SELECT dbo.usf_decode_zero (NULL,1); --Retorno: NULL
-- exemplo tratando, o erro de divisão por zero, Mensagem 8134 (CLÁSSICA)
SELECT 2400/dbo.usf_decode_zero(0,1); --Retorno: 2400
SELECT 2400/dbo.usf_decode_zero(2400,1); --Retorno: 1
SELECT 2400/dbo.usf_decode_zero(NULL,1); --Retorno: NULL