参数化解码功能

时间:2013-09-13 04:47:52

标签: oracle function decode

在oracle中,我正在使用如下所示的Decode语句。出于安全原因,我不希望代码具有硬编码值,并且我计划创建新的查找表。

  Select CONCAT( Decode(A.COUNTRY_INITIAL,
                        'A','America',
                        'B','Brazil',
                        'F','FINLAND',
                        NULL),
                 Decode(A.ADD_VALUE,
                        'M','YES',
                        NULL))
  from  (
      Select SUBSTR(COUNTRY_BASE, -1,1) as COUNTRY_INITIAL,
             SUBSTR(IS_VALUED, -1,1) as ADD_VALUE
      from TBL1
  )A

Refernece Table
*******************
Clmn1   Clmn2   Clmn3
--------------------------
cntry1  A       America
cntry2  B       Brazil
cntry3  F       Finland
Value1  M       YES

请您告诉我如何在解码逻辑中加入它。还可以在Oracle函数中使用此CODE SNIPPET。

3 个答案:

答案 0 :(得分:1)

如果您要将查找信息存储在表格中,则不会使用DECODE。你加入了两个表

SELECT ref.clmn3
  FROM tbl1 t1
       LEFT OUTER JOIN <<reference table>> ref
         ON( substr(t1.country_base, -1, 1) = ref.clmn2 )

由于您的DECODENULL,我猜您希望某些行tbl1在参考表中没有匹配的行,所以我猜你想要LEFT OUTER JOIN而不是INNER JOIN

答案 1 :(得分:0)

如果您使用单独的表来存储值,则不需要解码功能。你可以简单地加入这两个表。

select a.country_base,
       a.is_valued,
       b.clmn3,
       c.clmn3
  from tbl1 a left outer join reference_table b
              on (substr(a.country_base, -1, 1) = b.clmn2
              and b.clmn1 like 'cntry%'  --extra clause needed if there are same country and value codes
              )
              left outer join reference_table c
              on (substr(a.is_valued, -1, 1) = c.clmn2
              and c.clmn1 like 'Value%'  --extra clause needed if there are same country and value codes
              );

答案 2 :(得分:0)

如果您在表格中包含这些详细信息,则只需使用联接即可获得所需的输出。

select t1.COUNTRY_BASE,ref.Clmn3,ref1.Clmn3
frorm TBL1 t1
left outer join reftable ref
on SUBSTR(t1.COUNTRY_BASE, -1,1)=ref.Clmn2  
left outer join reftable ref1
on SUBSTR(t1.IS_VALUED, -1,1)=ref.Clmn2;