2013-02-27 8 views
1

Oracle Apex 4,2를 사용하고 있습니다. 나는 '버전'이라는 컬럼이있는 테이블을 가지고있다. 각 행의 '버전'열에는 쉼표로 구분 된 값 목록이 있습니다. '1,2,3,4'.
하나의 행에 대해 쉼표로 구분 된 각 값의 목록을 가진 선택 목록을 만들려고합니다. 이것에 대한 SQL 쿼리는 무엇입니까?Oracle Apex - 쉼표로 구분 된 LOV

예 :

테이블 이름 : 제품

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

원하는 출력 :
두 선택 목록.
첫 번째는 분명합니다. 제품 테이블에서 name 열을 선택하기 만하면됩니다. 이렇게하면 사용자는 원하는 제품을 선택할 수 있습니다. 두 번째 것은 제가 잘 모르는 것입니다. 사용자가 첫 번째 선택 목록에서 'myProd1'을 선택했다고 가정 해 봅시다. 그런 다음 두 번째 선택 항목에는 '1.0', '1.1'또는 '1.2'중에서 선택할 수있는 다음 값 목록이 포함되어야합니다.

+1

샘플 데이터 및/또는 원하는 결과를 입력하십시오. 둘 다 더 낫다. 당신이 찾고있는 것을 이해하는 것은 너무 어렵습니다. – Art

+0

@Art는 샘플 데이터와 원하는 출력을 추가하여 조언을 제공해 주므로 도움을 주시면 대단히 감사하겠습니다. –

+0

죄송합니다. 아직도 무엇을 찾고 계신지 이해하지 못합니다. 출력을 테이블 형식으로 둡니다 (예 : 열, 값 ... ctrl + K를 사용하여 코드 서식을 지정하십시오. – Art

답변

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 등 모든 값 ...

쉼표로 변환하는 예를 사용하십시오. 테이블에 값. harcoded '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 
/

당신은 출력에 떨어지게 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를 위해서는 PL/SQL이 아닌 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; 
/