如何在单个记录中输出不同的值

How to output different values in a single record

我有一个字符串形式的值。字段名称是 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 输出值。

所以还需要额外的两个步骤:

  1. 将 CF$_LMWEQUIMENT 字符串拆分为可传递给翻译函数的不同标记。
  2. 将翻译函数的输出连接成一个字符串。

我们可以使用 REGEXP_SUBSTR() 实现第一步,使用 LISTAGG() 实现第二步。这是一个解决方案(使用 a working demo on 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。这就是为什么像我这样的人总是大谈 the importance of normalisation


我的解决方案只针对只有一行数据被选中的场景。当涉及多行时,它甚至更复杂。我现在没有时间为此做一个演示,但如果这对你不起作用,请给我评论,我稍后会选择它。