如何从包含逗号分隔条目的变量中创建(不同的)值列表?

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 循环中创建一个逗号分隔的列表

从具有不同值的逗号分隔 JSON 对象填充 html 下拉列表

Google表格中的笛卡尔/交叉连接以获取逗号分隔值

C#如何检测包含逗号分隔的整数列表的变量?