2013-02-27 169 views
1

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

例子:

表名称:产品

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

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

+1

请把一些样本数据和/或所需的输出。两者都更好。这很难理解你在找什么。 – Art 2013-02-27 17:11:40

+0

@Art增加了样本数据和期望的输出,感谢您的建议,非常感谢您的帮助。 – 2013-02-27 17:26:39

+0

对不起,还是不明白你在找什么。以表格格式输出输出,例如列,值...使用Ctrl + K格式化代码。 – Art 2013-02-27 17:29:01

回答

4

阅读最新评论后,我明白你想要的不是LOV,而是列表项目。尽管它也可能是一个LOV。第一个列表项目/ lov将具有仅由用户从其中选择的所有产品,例如, Prod1,Prod2,Prod3 ...第二个列表项的所有版本都将从逗号分隔值转换为您的示例中的表格,如下面的示例中所示。因为根据我的理解,用户可能会从该列表中选择每个产品只有一个值。单个产品可能有很多值,例如Prod1的值为1,2,3,4,但用户只需要选择一个。正确?这就是为什么你需要将逗号值转换为表格。选择第一个查询是水木清华LK这样的:

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

使用我的示例转换逗号sep。值到表。用表中的值列替换已编码的'1,2,3,4'。用您的表名代替双

如果您需要单个查询和单个结果中的产品和版本,那么只需加入/ outer join(左,右连接)两个表。

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

在这种情况下,你会得到平稳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; 
/