Ste*_*lsh 1 sql select list oracle-apex
我正在使用 Oracle Apex 4,2。我有一个表格,其中有一列名为“版本”。在每一行的“版本”列中,有一个以逗号分隔的值列表,例如“1,2,3,4”。
我正在尝试创建一个选择列表,其值列表将是每个行中用逗号分隔的值。对此的 SQL 查询是什么?
例子:
表名:产品
Name | Versions
--------------------
myProd1 | 1,2,3
myProd2 | a,b,c
Run Code Online (Sandbox Code Playgroud)
期望的输出:
两个选择列表。
第一个很明显,我只是从产品表中选择名称列。通过这种方式,用户可以选择他们想要的任何产品。第二个是我不确定的。假设用户从第一个选择列表中选择了“myProd1”。然后第二个选择应包含以下供用户选择的值列表:“1.0”、“1.1”或“1.2”。
阅读您的最新评论后,我明白您想要的不是 LOV 而是列表项。虽然它也可以是一个 LOV。第一个列表项/lov 将仅包含用户从中选择的所有产品,例如 Prod1、Prod2、Prod3...第二个列表项将所有版本从逗号分隔值(如您的示例)转换为表格,如下面的示例所示. 因为根据我的理解,用户可能只能从这个列表中为每个产品选择一个值。单个产品可能有多个值,例如Prod1 的值有1,2,3,4。但用户只需要选择一个。正确的?这就是为什么您需要将逗号值转换为表格的原因。第一个查询选择是 smth lk 这个:
SELECT prod_id
FROM your_prod_table
/
id
--------
myProd1
myProd2
.....
Run Code Online (Sandbox Code Playgroud)
第二个查询应该选择 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
.....
Run Code Online (Sandbox Code Playgroud)
以上将返回产品的所有版本,例如 myProd1 等的所有值...
使用我的示例转换逗号 sep。要表的值。将硬编码的 '1,2,3,4' 替换为表中的值列。用你的表名替换双
如果您需要单个查询和单个结果中的产品和版本,那么只需连接/外部连接(左连接、右连接)两个表。
SELECT p.prod_id, v.version
FROM your_prod_table p
, your_versions_table v
WHERE p.prod_id = v.prod_id
/
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将在输出中得到 smth lk:
id | Values
------------------
myProd1 | 1,2,3,4
myProd2 | a,b,c,d
Run Code Online (Sandbox Code Playgroud)
如果您在上面的查询中将逗号转换为表格,那么您将得到这个 - 全部在一个列表或 LOV 中:
id | Values
------------------
myProd1 | 1
myProd1 | 2
myProd1 | 3
myProd1 | 4
myProd2 | a
myProd2 | b
myProd2 | c
myProd2 | d
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。同样,如果 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)
/
Run Code Online (Sandbox Code Playgroud)
上面所有的输出都是一样的:
STR_2_TAB
----------
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
表的逗号 - 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;
/
Run Code Online (Sandbox Code Playgroud)