質問

Is it possible to use SELECT result as DECODE parameters when this SELECT returns only one record with prepared string? For example:

SELECT replace(replace(serialized_data)..)..) as result FROM table

Returns following result in ONE ROW:

0,'label0',1,'label1',2,'label2'

But when I put this to DECODE it's being interpreted as ONE PARAMETER. Is there possiblity to convert this result "string" to "pure" sql code? ;)

Thanks for any help.

役に立ちましたか?

解決

You could kind of replicate decode by use of instr and substr. An example below (which could probably be tidied up considerably but works):

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)

You do need to have a semi-colon (VALSEP) at the end of the text though to ensure you can find the last value (though it's possible to work around that if I looked into it further).

他のヒント

list_agg or wm_concat depending on version of oracle.

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

You can use dynamic 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;

This is just a quick example, not showing any output, etc.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top