Как использовать запись результата SELECT в качестве параметров DECODE? - PullRequest
2 голосов
/ 28 декабря 2011

Можно ли использовать результат SELECT в качестве параметров DECODE, когда этот SELECT возвращает только одну запись с подготовленной строкой? Например:

SELECT заменить (заменить (serialized_data) ..) ..) как результат ИЗ таблицы

Возвращает следующий результат в ОДНОЙ СТРОКЕ:

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

Но когда я помещаю это в DECODE, оно интерпретируется как ОДИН ПАРАМЕТР. Есть ли возможность преобразовать этот результат "строка" в "чистый" sql код? ;)

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2011

Вы можете использовать динамический 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;

Это просто быстрый пример, не показывающий вывод и т. Д.

0 голосов
/ 28 декабря 2011

Вы можете отчасти повторить decode, используя instr и 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) в конце текста, чтобы убедиться, что вы можете найти последнее значение (хотя можно обойти это, если я рассмотрю его дальше).

0 голосов
/ 28 декабря 2011

list_agg или wm_concat в зависимости от версии oracle.

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

...