如何从包含逗号分隔条目的变量中创建(不同的)值列表?
Posted
技术标签:
【中文标题】如何从包含逗号分隔条目的变量中创建(不同的)值列表?【英文标题】:How can a list of (distinct) values be created from a variable containing comma separated entries? 【发布时间】:2019-06-04 09:44:22 【问题描述】:我在 APEX 报告(保存在名为 APR 的表中)中有一个用户生成的变量 (KEYWORDS),它允许用户输入多个(逗号分隔的)值。我想设置一个不同值的列表,这些值以前用于允许将来通过弹出式 LOV 进行选择。
我已经设法使用
创建了一个不同的列表SELECT distinct regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL) from dual
connect by regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL)
is not null
;
select LISTAGG(KEYWORDS, ',') from APR
是:'test,test,TEST2,test,TEST2,test,TEST2,test3'
而select keywords from APR
由 6 行组成:
test
test,TEST2
test,TEST2
test
TEST2
test3
我的问题是尝试在 Edit LOV 查询中实现这一点。
select (select distinct regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL) from dual
connect by regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL)
is not null) as display_value,
(select distinct regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL) from dual
connect by regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL)
is not null) as return_value
from APR
order by 1
此代码已在编辑 LOV 部分中成功验证,但弹出式 LOV 中未显示任何值。粘贴到 SQL 命令中,我收到以下错误消息:ORA-01427:单行子查询返回多于一行。
【问题讨论】:
display_value 和 return_value 值有什么区别 display_value 和 return_value 值之间没有区别 - 如果有办法简化这个/同时分配给两者,那么肯定很乐意实现(我对 sql 很陌生)。弹出的 LOV 应该显示显示值供用户选择,然后返回选择以编辑表格(即不使用标签)。 【参考方案1】:您发布的查询无效; listagg
需要 within group
子句。
无论如何:我建议您使用该查询(您可能已经正确编写)作为数据源,如下所示:
with t_data as
(select listagg(keywords, ',') within group (order by null) col
from apr
)
select col display_value,
col return_value
from t_data
order by col
【讨论】:
【参考方案2】:这是预期的结果吗?
代码:-
WITH apr_new AS (
SELECT DISTINCT regexp_substr(keywords,'[^,]+',1,level) keywords_new
FROM (SELECT LISTAGG(keywords,',') WITHIN GROUP(ORDER BY keywords) keywords FROM apr) apr
CONNECT BY regexp_substr(keywords,'[^,]+',1,level) IS NOT NULL
) SELECT
keywords_new AS display_value,
keywords_new AS return_value
FROM apr_new ORDER BY 1;
结果:-
测试2测试2
测试3测试3
测试测试
【讨论】:
感谢您的建议。这是正确的结果(假设代表显示和返回值的两列)但运行代码时出现错误:ORA-00933:SQL 命令未正确结束 为我成功执行。请您重新检查一下。【参考方案3】:感谢@Littlefoot,使用该框架
使用
with t_data as
(select distinct regexp_substr((select LISTAGG(KEYWORDS, ',') within group (order by null) from APR), '[^,]+', 1, LEVEL) col from dual
connect by regexp_substr((select LISTAGG(KEYWORDS, ',') within group (order by null)from APR), '[^,]+', 1, LEVEL)
is not null )
select col display_value,
col return_value
from t_data
order by col
或
with t_data as
(select distinct regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL) col from dual
connect by regexp_substr((select LISTAGG(KEYWORDS, ',') from APR), '[^,]+', 1, LEVEL)
is not null )
select col display_value,
col return_value
from t_data
order by col
产生相同的结果。尽管 listagg 显然需要在 group 子句中,但后者仍然有效(有兴趣知道这是否会导致任何问题)。
【讨论】:
以上是关于如何从包含逗号分隔条目的变量中创建(不同的)值列表?的主要内容,如果未能解决你的问题,请参考以下文章
Python:试图从一个寻找可被 3 整除的数字的 for 循环中创建一个逗号分隔的列表