如何使用SELECT结果记录作为DECODE参数?

时间:2011-12-28 12:32:21

标签: oracle select plsql decode oracle8i

当SELECT仅使用准备好的字符串返回一条记录时,是否可以将SELECT结果用作DECODE参数? 例如:

  

SELECT replace(replace(serialized_data)..)..)作为FROM table

的结果

在ONE ROW中返回以下结果:

  

0, 'label0',1 'label1的',2 'LABEL2'

但是当我把它放到DECODE时,它被解释为一个参数。 有可能将此结果“string”转换为“pure” sql代码吗? ;)

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

list_agg或wm_concat,具体取决于oracle的版本。

http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm

答案 1 :(得分:0)

您可以使用动态SQL:

declare
  DECTXT   varchar2(4000);
begin
  select replace(replace(serialized_data)..)..) as result into dectxt from table;
  execute immediate 'select decode(col1,' || DECTXT || ') from tab1';
end;

这只是一个简单的例子,没有显示任何输出等。

答案 2 :(得分:0)

您可以使用decodeinstr复制substr。下面的一个例子(可能会大大整理但有效):

select DTXT
      ,Nvl(
         Substr(
           DTXT
          ,Instr(DTXT, SEARCHTXT || VALMTCH)
           + Length(SEARCHTXT || VALMTCH)
          ,  Instr(DTXT, VALSEP, Instr(DTXT, SEARCHTXT || VALMTCH))
           - Instr(DTXT, SEARCHTXT || VALMTCH)
           - Length(SEARCHTXT || VALMTCH))
        ,CASEOTHER)
         as TXTMATCH
  from (select '0=BLACK;1=GREEN;2=YELLOW;' as DTXT
              ,'1' as SEARCHTXT
              ,';' as VALSEP
              ,'=' as VALMTCH
              ,'OTHER' as CASEOTHER
          from Dual)

你需要在文本末尾加一个分号(VALSEP),以确保你能找到最后一个值(尽管如果我进一步研究它可以解决这个问题)。