【问题标题】:DECODE( ) function in SQL ServerSQL Server 中的 DECODE( ) 函数
【发布时间】:2010-12-06 06:22: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')

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,你想要解码但在 T-SQL 中的等价物

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

    【讨论】:

      【解决方案3】:

      当我使用该功能时

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

      然后说'>'附近的语法错误

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

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

      【讨论】:

        【解决方案4】:

        在 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
        

        【讨论】:

          【解决方案5】:

          很容易做到:

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

          【讨论】:

            【解决方案6】:

            加入这个“文字表”,

            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)
            

            【讨论】:

              【解决方案7】:

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

              甲骨文:

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

              MSSQL (2012+):

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

              坏消息:

              DECODE 的参数超过 4 个会导致丑陋的 IIF 级联

              【讨论】:

              • IIF 是 SQL Server 2012 及更高版本 - 只是作为警告。最初的问题是在 2005 年,尽管现在大多数人都会向前推进。
              • 使用较新版本的 sql server 更优雅的解决方案!
              • 节省了我的时间,因为我已经有很多案例了:)
              【解决方案8】:

              在我的案例中,我在很多地方都使用了它,第一个示例,如果您有 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 
              

              【讨论】:

                【解决方案9】:

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

                CHOOSE funtion in TSQL documentation

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

                引用文档:

                索引

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

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

                val_1 ... val_n

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-10-07
                  • 1970-01-01
                  • 2020-10-07
                  • 2021-12-29
                  • 2020-01-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-11
                  相关资源
                  最近更新 更多