首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle Apex -逗号分离LOV

Oracle Apex -逗号分离LOV
EN

Stack Overflow用户
提问于 2013-02-27 16:56:59
回答 1查看 3.2K关注 0票数 1

我使用的是Oracle 4,2。我有一个表,其中有一个列,名为“versions”。在“版本”列中,每一行都有一个由逗号分隔的值列表,例如'1,2,3,4‘。

我正在尝试创建一个Select,其值列表将是其中一行用逗号分隔的每个值。对此的SQL查询是什么?

示例:

表名:产品

代码语言:javascript
复制
Name     | Versions
--------------------
myProd1  | 1,2,3
myProd2  | a,b,c

期望产出:

两个选择名单。

第一个很明显,我只是从products表中选择了name列。这样,用户就可以选择他们想要的任何产品。第二个是我不确定的那个。假设用户从第一个选择列表中选择了'myProd1‘。然后,第二个select应该包含供用户选择的以下值列表:'1.0‘、'1.1’或'1.2‘。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-27 17:26:09

在阅读了你最近的评论后,我明白你想要的不是一个LOV,而是一个列表项目。虽然它也可以是一个LOV。第一个列表项目/lov将只有用户从中选择的所有产品,例如Prod1,Prod2,Prod3.如下面的示例所示,第二个列表项将所有版本从逗号分隔的值转换为表。因为在我的理解中,用户可能只会从这个列表中选择每个产品的一个值。单个产品可能有许多值,例如Prod1的值为1、2、3、4,但用户只需选择一个。对,是这样?这就是为什么需要将逗号值转换为表的原因。第一个查询选择是smth,如下所示:

代码语言:javascript
复制
SELECT prod_id
  FROM your_prod_table
 /

 id      
 --------
 myProd1 
 myProd2 
 .....

第二个查询应该选择product_id在your_prod_table中的所有版本:

代码语言:javascript
复制
 SELECT version FROM your_versions_table
   WHERE prod_id IN (SELECT prod_id FROM your_prod_table)
 /

 Versions
 --------
 1,2,3,4   -- myProd1 values
 a,b,c,d   -- myProd2 values
 .....

以上内容将返回产品的所有版本,例如myProd1等的所有值。

使用我的例子转换逗号sep。值到表中。用表中的值列替换原编码的'1,2,3,4‘。用表名替换dual

如果您需要一个查询和单个结果中的产品和版本,那么只需连接/外部连接(左、右连接)两个表。

代码语言:javascript
复制
SELECT p.prod_id, v.version 
  FROM your_prod_table     p
     , your_versions_table v
  WHERE p.prod_id = v.prod_id
 /

在本例中,您将得到输出中的smth lk:

代码语言:javascript
复制
 id      |  Values
 ------------------
 myProd1 | 1,2,3,4
 myProd2 | a,b,c,d

如果您在上面的查询中将逗号转换为表,那么您将在一个列表或LOV中得到这一切:

代码语言:javascript
复制
 id      |  Values
 ------------------
 myProd1 | 1
 myProd1 | 2
 myProd1 | 3
 myProd1 | 4
 myProd2 | a
 myProd2 | b
 myProd2 | c
 myProd2 | d

我希望这能帮到你。同样,如果在APEX中可用,则可以使用LOV或list值。两个单独的值列表--一个用于其他版本的产品--对我来说更有意义。在列表项的情况下,您将需要两个独立的查询,而且只对值/版本进行逗号到表的转换会更容易。但这取决于你。

逗号到表格示例:

代码语言:javascript
复制
-- Comma to table - regexp_count --
SELECT trim(regexp_substr('1,2,3,4', '[^,]+', 1, LEVEL)) str_2_tab
  FROM dual
 CONNECT BY LEVEL <= regexp_count('1,2,3,4', ',')+1
/

-- Comma to table - Length -
SELECT trim(regexp_substr('1,2,3,4', '[^,]+', 1, LEVEL)) token
  FROM dual
CONNECT BY LEVEL <= length('1,2,3,4') - length(REPLACE('1,2,3,4', ',', ''))+1
/

-- Comma to table - instr --
SELECT trim(regexp_substr('1,2,3,4', '[^,]+', 1, LEVEL)) str_2_tab
  FROM dual
 CONNECT BY LEVEL <= instr('1,2,3,4', ',', 1, LEVEL - 1)
/

上述各项的产出都是相同的:

代码语言:javascript
复制
STR_2_TAB
----------
1
2
3
4

逗号到表-PL/SQL示例。对于LOV,您需要SQL而不是PL/SQL。

代码语言:javascript
复制
DECLARE
  v_array apex_application_global.vc_arr2;
  v_string varchar2(2000);
BEGIN
-- Convert delimited string to array
   v_array:= apex_util.string_to_table('alpha,beta,gamma,delta', ',');

  FOR i in 1..v_array.count LOOP
    dbms_output.put_line('Array: '||v_array(i));
  END LOOP;

 -- Convert array to delimited string
  v_string:= apex_util.table_to_string(v_array,'|');
  dbms_output.put_line('String: '||v_string);
END;
/
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15117798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档