2009-10-13 7 views
17
SELECT PC_COMP_CODE, 
     'R', 
     PC_RESUB_REF, 
     DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR'), 
     PC_DEPT_NO DEPT, 
     '', --PC_DEPT_NO, 
     PC_SL_LDGR_CODE + '/' + PC_SL_ACNO, 
     SUM(DECODE(PC_SL_LDGR_CODE, '02', 1, -1) * PC_AMOUNT), 
     PC_CHEQUE_NO CHQNO 
    FROM GLAS_PDC_CHEQUES 
WHERE PC_RESUB_REF IS NOT NULL 
    AND PC_DISCD NOT IN ('d', 'D', 'T') 
GROUP BY PC_RESUB_REF, 
     PC_COMP_CODE, 
     'JJ', 
     PC_SL_LDGR_CODE + '/' + PC_SL_ACNO, 
     PC_DEPT_NO, 
     PC_CHEQUE_NO, 
     DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR') 

Ci-dessus est une requête Oracle; comment puis-je utiliser la fonction DECODE() dans SQL Server 2005?Fonction DECODE() dans SQL Server

+5

Vous voudrez peut-être reformater le SQL un peu et élaborer sur ce qu'est le problème spécifique. –

+0

duplication possible de [fonction Oracle Decode équivalente dans Sql Server 2005+] (http://stackoverflow.com/questions/4654084/oracle-decode-function-equivalent-in-sql-server-2005) – BIBD

Répondre

38

Vous pouvez utiliser le 'CASE .. QUAND .. ALORS .. .. ELSE END' syntaxe en SQL.

0

Vous pouvez vous CAS. Voir here

Je suppose que vous voulez déplacer la requête de ORACLE à SQL Server?

17

Si je comprends bien la question, vous voulez l'équivalent de décodage, mais dans T-SQL

Select YourFieldAliasName = 
CASE PC_SL_LDGR_CODE 
    WHEN '02' THEN 'DR' 
    ELSE 'CR' 
END 
0

lorsque j'utilise la fonction

select dbo.decode(10>1 ,'yes' ,'no') 

puis dire erreur de syntaxe près de '>'

Malheureusement, e à n'obtient pas vous avoir autour de la clause CASE dans le SQL, puisque vous auriez besoin pour convertir l'expression logique à un paramètre de bit correspondant au type du premier argument de la fonction:

create function decode(@var1 as bit, @var2 as nvarchar(100), @var3 as nvarchar(100)) 
returns nvarchar(100) 
begin 
return case when @var1 = 1 then @var2 else @var3 end; 
end; 

select dbo.decode(case when 10 > 1 then 1 else 0 end, 'Yes', 'No'); 
1

Créer une fonction dans SQL serveur comme ci-dessous et remplacer le DECODE avec dbo.DECODE

CREATE FUNCTION DECODE(@CondField as nvarchar(100),@Criteria as nvarchar(100), 
         @True Value as nvarchar(100), @FalseValue as nvarchar(100)) 
returns nvarchar(100) 
begin 
     return case when @CondField = @Criteria then @TrueValue 
        else @FalseValue end 
end 
1

Il est facile à faire:

select 
    CASE WHEN 10 > 1 THEN 'Yes' 
    ELSE 'No' 
END 
0

rejoindre ce "tableau littéral",

select 
    t.c.value('@c', 'varchar(30)') code, 
    t.c.value('@v', 'varchar(30)') val 
from (select convert(xml, '<x c="CODE001" v="Value One" /><x c="CODE002" v="Value Two" />') aXmlCol) z 
cross apply aXmlCol.nodes('/x') t(c) 
1

Juste pour être complet (parce que personne d'autre a posté la réponse la plus évidente):

Oracle:

DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR') 

MSSQL:

IIF(PC_SL_LDGR_CODE='02', 'DR', 'CR') 

Les mauvaises nouvelles:

DECODE avec plus de 4 arguments résulterait en une IIF cascade

Questions connexes