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

Sql 如何在单个记录中输出不同的值,sql,oracle,plsql,plsqldeveloper,plsql-package,Sql,Oracle,Plsql,Plsqldeveloper,Plsql Package,我有一个字符串形式的值。字段名为CF$\u LMWEQUIMENT,输出为单个字符串,由^分隔。以下是一个例子: ^All_Equipm^Consulting^DITCHCLEANER^Friction_M^ 我需要以这种方式输出数据库值的实际值,如下所示: All Equipment, Consulting, Ditch Cleaner, Friction Management. 我有这个查询来获取CF$\u LMWEQUIMENT SELECT T1.OPPORTUNITY_NO AS

我有一个字符串形式的值。字段名为
CF$\u LMWEQUIMENT
,输出为单个字符串,由
^
分隔。以下是一个例子:

^All_Equipm^Consulting^DITCHCLEANER^Friction_M^
我需要以这种方式输出数据库值的实际值,如下所示:

All Equipment, Consulting, Ditch Cleaner, Friction Management. 
我有这个查询来获取
CF$\u 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的输出将是
沟渠清洁器
。但是,我的目标是将所有值放在一个字符串和单元格中,如我在上一段中所述->
所有设备、咨询、沟渠清理器、摩擦管理

你可以在图片中注意到。现场设备组的字符串由(^)分隔

custom\u field\u enum\u values\u api.Get\u Client\u Value('EQUIGROLMW','DITCHCLEANER')

但是API只允许我传递两个参数:第一个是table_name,第二个是database_值。API的输出是实名,这是我要寻找的值。我希望我的输出类似于一个单元格中的图片,如Equiment_group field,但我希望API的值输出在单个单元格中


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

  • 将CF$\u LMWEQUIMENT字符串拆分为可传递给翻译函数的不同标记
  • 将转换函数的输出连接到单个字符串中
  • 我们可以使用REGEXP_SUBSTR()完成第一步,使用LISTAGG()完成第二步。这里有一个解决方案

    类似这样的代码再次证明了拙劣数据建模的代价是令人震惊的。这就是为什么像我这样的人总是喋喋不休


    我的解决方案只解决了一个场景,其中有一行数据需要选择。当涉及多行时,情况就更复杂了。我现在没有时间做一个演示,但请评论我,如果这对你不起作用,我会在以后拿起这个

    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
    /