I was reading a function in Oracle namely “Decode”. It is very handy when it comes to search a variable and return the result based on search. It has been asked on multiple forums, what the EQUIVALENT of DECODE IN SQL SERVER is? Basically, we can achieve the same in SQL Server using Case and IIF statements.
Lets view the decode in Oracle.
Select DECODE(PoleDirection, 'North','N', 'South','S', 'East','E','WEST','W', 'Not Applicable') AS [Poles] FROM TablePoles
Lets view the Equivalent Code in SQL Server.
Declare @PoleDirection as varchar(10) Set @PoleDirection= 'North' SELECT CASE WHEN @PoleDirection = 'North' THEN 'N' WHEN @PoleDirection = 'South' THEN 'S' WHEN @PoleDirection = 'East' THEN 'E' WHEN @PoleDirection = 'WEST' THEN 'W' ELSE 'Not Applicable' END AS [Poles]
Decode function in SQL server
Given below is the DECODE function in SQL SERVER.
Create FUNCTION [dbo].[DECODE] (
@Expression nvarchar(max),
@String nvarchar(Max))
RETURNS nvarchar(Max)
AS
Begin
Declare @Delimiter as varchar(1)
Declare @ReturnValue as nvarchar(max)
Set @Delimiter=','
Declare @Xml AS XML
Declare @Table TABLE(
[ID] int Identity(1,1),
Splitcolumn VARCHAR(MAX)
)
SET @Xml = cast(('<A>'+replace(@String,@Delimiter,'</A><A>')+'</A>') AS XML)
INSERT INTO @Table SELECT A.value('.', 'varchar(max)') as [Column] FROM @Xml.nodes('A') AS FN(A)
IF (Select Count (*) from @Table A Where @Expression=A.[SplitColumn])=1
Begin
Select top 1 @ReturnValue=B.[Splitcolumn] from @Table A
Left Join @Table B On A.[ID]<B.[ID]
Where @Expression=A.[SplitColumn]
Order By A.[ID]
END
Else
BEGIN
Select top 1 @ReturnValue=A.[Splitcolumn] from @Table A
Order By A.[ID] DESC
END
RETURN @ReturnValue
End
GO
Syntax :
Decode (expression , search , result [, search , result]... [, default])
Examples 1:
Create table tbl_Sample1
(
[ID] varchar(6),
[Employee Name] varchar(50),
[Performance Evaluation] varchar(10)
)
GO
Insert into tbl_Sample1 values ('STD001','Bob','Excellent')
Insert into tbl_Sample1 values ('STD002','Alexander','Good')
Insert into tbl_Sample1 values ('STD003','Hosanna','Fair')
GO
SELECT [ID],[Employee Name],[Performance Evaluation]
,dbo.Decode( [Performance Evaluation],'Excellent,100,Good,80,Fair,60,Unknown')
as [Performace Index]
from tbl_Sample1
GO

Examples 2:
Create table tbl_Sample2 ( [ID] int , [Country] varchar(50), [Short Name] varchar(3) ) GO Insert into tbl_Sample2 Values (1,'PAKISTAN','PAK') Insert into tbl_Sample2 Values (2,'UNITED STATES OF AMERICA','USA') Insert into tbl_Sample2 Values (3,'UNITED KINGDOM','UK') Insert into tbl_Sample2 Values (4,'UNITED ARAB EMIRATES','UAE') go SELECT [ID],[Country],[Short Name] ,dbo.Decode([Short Name],'PAK,RS,USA,USD,UK,GBP,UAE,AED,Not Matched') as [Currency] from tbl_Sample2 GO

This function looks good , but it affects performance of the query 2000 times more than the case statement used in query.
Hi Javed,
You are right.Definitely, it will call the function as many times as number of rows. But sometimes, we need to reduce the complexity & length of case statements.
Thank you
Imran