2009-10-13 119 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') 

Más arriba es una consulta de Oracle; ¿cómo puedo usar la función DECODE() en SQL Server 2005?Función DECODE() en SQL Server

+5

Es posible que desee volver a formatear el SQL y explicar en detalle cuál es el problema específico. –

+0

posible duplicado de la función de [Oracle Decode equivalente en Sql Server 2005+] (http://stackoverflow.com/questions/4654084/oracle-decode-function-equivalent-in-sql-server-2005) – BIBD

Respuesta

38

Se podría utilizar el 'CASO CUANDO .. .. entonces .. .. ELSE END' sintaxis en SQL.

0

Puede CASE. Ver here

Supongo que desea mover la consulta de ORACLE a SQL Server?

17

Si entiendo bien la pregunta, desea que el equivalente de decodificación pero en T-SQL

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

cuando se utiliza la función

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

luego dicen error de sintaxis cerca de '>'

Desafortunadamente, TH a no ir a todos lados con la cláusula CASE en el SQL, ya que se necesitaría para convertir la expresión lógica a un parámetro poco para que coincida con el tipo del primer argumento de la función:

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

crear una función en SQL servidor como abajo y reemplazar el DECODE con 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

es fácil de hacer:

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

unirse a esta "mesa literal",

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

simplemente para la corrección (porque nadie más ha escrito la respuesta más obvia):

Oracle:

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

MSSQL:

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

La mala noticia:

DECODE con más de 4 argumentos daría como resultado una cascada fea IIF