0

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

在此处输入图像描述

4

1 回答 1

1

因此,还需要额外的两个步骤:

  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。这就是为什么像我这样的人总是大谈正常化的重要性


我的解决方案仅解决了要选择一行数据的情况。当涉及多行时,情况会更加复杂。我现在没有时间为此做演示,但是如果这对您不起作用,请评论我,我稍后会选择它。

于 2020-01-22T14:27:04.870 回答