Как вывести разные значения в одной записи - PullRequest
0 голосов
/ 22 января 2020

У меня есть значение в виде строки. Имя поля - CF$_LMWEQUIMENT, а вывод представляет собой одну строку, разделенную ^. Вот пример:

^All_Equipm^Consulting^DITCHCLEANER^Friction_M^

Мне нужно вывести реальные значения таким образом значения базы данных, как это:

All Equipment, Consulting, Ditch Cleaner, Friction Management. 

У меня есть этот запрос, чтобы получить CF$_LMWEQUIMENT

SELECT T1.OPPORTUNITY_NO AS BO_NUMBER,
       T2.CF$_LMWEQUIMENT AS Equiment_Group,
       T1.STATE AS Status
FROM BUSINESS_OPPORTUNITY T1 JOIN 
BUSINESS_OPPORTUNITY_CFT T2 on (T1.OBJKEY = T2.ROWKEY)

У меня есть API, который может преобразовываться в реальное значение, например:

select custom_field_enum_values_api.Get_Client_Value('EQUIGROLMW','DITCHCLEANER') 
from dual;

Выход API будет Ditch Cleaner. Однако моя цель состоит в том, чтобы все значения были в одной строке и ячейке, как я объяснил в предыдущем абзаце -> All Equipment, Consulting, Ditch Cleaner, Friction Management.

. Вы можете заметить на рисунке. Поле Equipment_Group содержит строку, разделенную (^)

custom_field_enum_values_api.Get_Client_Value('EQUIGROLMW','DITCHCLEANER')

Но API позволяет мне передавать только два параметра: первый - table_name, а второй - database_value. вывод API - это настоящее имя, которое представляет собой значение, которое я ищу. Я хочу, чтобы мои выходные данные были похожи на изображение в одной ячейке, например поле Equiment_group, но я хочу, чтобы значения, выводимые из API в одной ячейке.

enter image description here

1 Ответ

1 голос
/ 22 января 2020

Итак, необходимо выполнить два дополнительных шага:

  1. Разбить строку CF $ _LMWEQUIMENT на отдельные токены, которые можно передать в функцию перевода.
  2. Объединить выходные данные перевода функция в одну строку.

Мы можем использовать REGEXP_SUBSTR () для выполнения первого шага и LISTAGG () для выполнения второго. Вот решение (с рабочей демонстрацией на db <> fiddle ).

select t1.opportunity_no as bo_number,
        listagg(
         custom_field_enum_values_api.get_client_value('EQUIGROLMW',regexp_substr(cf$_lmwequiment,'[^\^]+', 1, level) ) 
         , ',' ) within group (order by level)
          as equiment_group,
       t1.state as status
from business_opportunity t1 
join business_opportunity_cft t2 on (t1.objkey = t2.rowkey)
connect by regexp_substr(cf$_lmwequiment,'[^\^]+', 1, level) is not null
group by t1.opportunity_no, t1.state
/

Еще раз, подобный код демонстрирует, что заработная плата моделирования тонких данных шокирует SQL. Вот почему такие люди, как я, всегда говорят о важности нормализации .


Мое решение предназначено только для сценария, в котором нужно выбрать одну строку данных. Это еще сложнее, когда задействовано несколько строк. У меня нет времени, чтобы сделать демонстрацию для этого прямо сейчас, но, пожалуйста, прокомментируйте меня, если это не работает для вас, и я подберу это позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...