2013-02-27 4 views
1

Я использую Oracle Apex 4,2. У меня есть таблица со столбцом в ней, называемая «версиями». В столбце «Варианты» для каждой строки есть список значений, разделенных запятыми, например. '1,2,3,4'.
Я пытаюсь создать список выбора, список значений которого будет представлять собой каждое из значений, разделенных запятыми для одной из строк. Каким будет SQL-запрос для этого?Oracle Apex - Comma Separated LOV

Пример:

Таблица Имя: Продукты

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

Желаемая выход:
Два Выберите списки.
Первое очевидно, я просто выбираю столбец имен из таблицы продуктов. Таким образом, пользователь может выбрать любой продукт, который им нужен. Второй - тот, о котором я не уверен. Предположим, пользователь выбрал «myProd1» из первого Select List. Затем второй выбор должен содержать следующий список значений, которые пользователь может выбрать: «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. Но пользователю нужно выбрать только один. Верный? Вот почему вам нужно преобразовать значения запятой в таблицу. Первый запрос выбора является лк-л в следующем:

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 
/

В этом случае вы получите 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 

Надеюсь, это поможет. Опять же, вы можете использовать значения LOV или списка, если они доступны в APEX. Для меня имеет смысл два отдельных списка значений - один для других продуктов для версий. В случае элементов списка вам понадобятся два отдельных запроса, как указано выше, и будет проще делать запятую для преобразования таблицы только для значений/версий. Но это зависит от вас.

Разделенный на примеры таблиц:

-- 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; 
/
Смежные вопросы