Oracle Apex - 逗号分隔的 LOV

Posted

技术标签:

【中文标题】Oracle Apex - 逗号分隔的 LOV【英文标题】:Oracle Apex - Comma Separated LOV 【发布时间】:2013-02-27 16:56:59 【问题描述】:

我正在使用 Oracle Apex 4,2。我有一个表,其中有一列称为“版本”。在每一行的“版本”列中,都有一个由逗号分隔的值列表,例如'1,2,3,4'。 我正在尝试创建一个选择列表,其值列表将是由逗号分隔的每行的每个值。对此的 SQL 查询是什么?

示例:

表名称:产品

Name     | Versions
--------------------
myProd1  | 1,2,3
myProd2  | a,b,c

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

【问题讨论】:

请输入一些示例数据和/或所需的输出。两者都更好。很难理解您在寻找什么。 @Art 添加了示例数据和所需的输出,感谢您的建议,非常感谢任何帮助。 对不起,还是不明白你在找什么。以表格格式输出,例如列、值... 使用 ctrl+K 格式化代码。 这些 .0、.1、.2 是从哪里来的?您是否有表格,或者您只需将现有值 ​​1 与 .0 连接起来,然后连接到 .1、.2、.4...(如果选择了 myProd1)?做起来似乎很简单。对于所有其他产品,同样的问题。这是您要查找的内容: SELECT 'myProd1' myProd1, '1.0,1.1,1.2' From dual; ???明天我会试着解决这个问题......说清楚。 我对这个例子做了一些改动,希望能让我更容易理解我想要什么。示例中的格式化代码是我的名为 Products 的表。我想要 2 个选择列表。 First 选择列表只是让用户选择 myProd1 或 myProd2。然后,第二个选择列表让用户选择他们想要的产品名称的版本。因此,如果用户选择 myProd1,则第二个选择列表将包含以下值列表:“1”、“2”或“3”。而如果用户选择 myProd2,第二个选择列表将具有以下值列表:'a'、'b' 或 'c'。 【参考方案1】:

阅读您最新的 cmets 后,我了解到您想要的不是 LOV,而是列表项。虽然它也可以是一个LOV。第一个列表项/lov 将仅包含用户从中选择的所有产品,例如Prod1,Prod2,Prod3... 第二个列表项将所有版本从逗号分隔值转换为您的示例中的表格,如下面的示例中所示。因为在我的理解中,用户可能只能从这个列表中为每个产品选择一个值。单个产品可能有很多值,例如Prod1 的值为 1、2、3、4。但用户只需选择一个。正确的?这就是您需要将逗号值转换为表格的原因。第一个查询选择是 smth lk this:

SELECT prod_id
  FROM your_prod_table
 /

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

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

 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 等的所有值...

使用我的示例转换逗号分隔符。值表。将硬编码的 '1,2,3,4' 替换为表中的值列。将 dual 替换为您的表名

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

SELECT p.prod_id, v.version 
  FROM your_prod_table     p
     , your_versions_table v
  WHERE p.prod_id = v.prod_id
 /

在这种情况下,您将在输出中得到 smth lk:

 id      |  Values
 ------------------
 myProd1 | 1,2,3,4
 myProd2 | a,b,c,d

如果您在上述查询中将逗号转换为表格,那么您将得到这个 - 全部在一个列表或 LOV 中:

 id      |  Values
 ------------------
 myProd1 | 1
 myProd1 | 2
 myProd1 | 3
 myProd1 | 4
 myProd2 | a
 myProd2 | b
 myProd2 | c
 myProd2 | d

我希望这会有所帮助。同样,如果 APEX 中可用,您可以使用 LOV 或列表值。两个单独的值列表——一个用于产品,另一个用于版本——对我来说更有意义。如果是列表项,您将需要如上所述的两个单独的查询,并且仅对值/版本进行逗号到表的转换会更容易。但这取决于你。

逗号到表格示例:

-- 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)
/

以上所有的输出都是一样的:

STR_2_TAB
----------
1
2
3
4

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

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;
/

【讨论】:

以上是关于Oracle Apex - 逗号分隔的 LOV的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle Apex 页面获取多个值并将其存储在表中

Oracle APEX - 来自 LDAP 的 LOV

交互式报表 Oracle Apex 5 上的 LOV

Oracle APEX 数据网格 LOV 在单击之前不显示显示名称

Oracle Apex 根据 LOV 选择的值动态启用/禁用文本字段

Oracle 行转列,逗号分隔