SQL Server中的DECODE()函数

时间:2009-10-13 09:58:32

标签: sql sql-server sql-server-2005 oracle

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')

以上是Oracle查询;如何在SQL Server 2005中使用DECODE()函数?

9 个答案:

答案 0 :(得分:46)

您可以在SQL中使用'CASE .. WHEN .. THEN .. ELSE .. END'语法。

答案 1 :(得分:23)

如果我正确理解了这个问题,你需要相当于解码但在T-SQL中

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

答案 2 :(得分:11)

仅仅为了完整性(因为没有其他人发布最明显的答案):

甲骨文:

std::mutex

MSSQL:

std::shared_ptr

坏消息:

带有4个以上参数的

DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR') 会导致丑陋的IIF(PC_SL_LDGR_CODE='02', 'DR', 'CR') 级联

答案 3 :(得分:2)

在SQL Server中创建一个函数,如下所示,并将DECODE替换为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

答案 4 :(得分:2)

这很容易做到:

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

答案 5 :(得分:1)

加入这个“文字表”,

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)

答案 6 :(得分:0)

  
    

当我使用函数

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

然后在'&gt;'

附近说出语法错误   

不幸的是,这不会让你在SQL中使用CASE子句,因为你需要它将逻辑表达式转换为bit参数以匹配第一个函数参数的类型:

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');

答案 7 :(得分:0)

在我的情况下,我在很多地方都使用过它,例如,如果您有2个选择语句(如性别(男性或女性)),则使用以下值:

SELECT CASE Gender WHEN 'Male' THEN 1 ELSE 2 END AS Gender

如果有多个条件(例如国籍),您可以将其用作以下语句:

SELECT CASE Nationality 
WHEN 'AMERICAN'   THEN 1 
WHEN 'BRITISH'   THEN 2
WHEN 'GERMAN'    THEN 3 
WHEN 'EGYPT'     THEN 4 
WHEN 'PALESTINE' THEN 5 
ELSE 6 END AS Nationality 

答案 8 :(得分:0)

如果选择所依赖的值是整数,可以使用CHOOSE函数:

CHOOSE funtion in TSQL documentation

CHOOSE ( index, val_1, val_2 [, val_n ] )  

引用文档:

索引

是一个整数表达式,表示在它后面的项目列表中的从 1 开始的索引。

如果提供的索引值具有 int 以外的数字数据类型,则该值将隐式转换为整数。如果索引值超出值数组的边界,则 CHOOSE 返回 null。

val_1 ... val_n

任何数据类型的逗号分隔值列表。