如何在单个记录中输出不同的值
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 输出值。
所以还需要额外的两个步骤:
- 将 CF$_LMWEQUIMENT 字符串拆分为可传递给翻译函数的不同标记。
- 将翻译函数的输出连接成一个字符串。
我们可以使用 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。
我的解决方案只针对只有一行数据被选中的场景。当涉及多行时,它甚至更复杂。我现在没有时间为此做一个演示,但如果这对你不起作用,请给我评论,我稍后会选择它。
我有一个字符串形式的值。字段名称是 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 输出值。
所以还需要额外的两个步骤:
- 将 CF$_LMWEQUIMENT 字符串拆分为可传递给翻译函数的不同标记。
- 将翻译函数的输出连接成一个字符串。
我们可以使用 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。
我的解决方案只针对只有一行数据被选中的场景。当涉及多行时,它甚至更复杂。我现在没有时间为此做一个演示,但如果这对你不起作用,请给我评论,我稍后会选择它。