2017-01-18 14 views
0

Есть ли способ получить имя столбца на основе его значения.Oracle: получить имя столбца на основе значения в таблице

Например

Скажем, у меня есть таблица с именем доступа, который имеет только одну строку в любое время, но отличается от одной схемы к другой. Кроме того, значение может быть только либо 0 или 1)

field0 | field1 
--------------- 
    1 | 0 

Есть ли способ, чтобы выбрать столбец «field0» на основе значений = «1»?

Я знаю, что могу сделать это, используя код для конкретной таблицы, но я хочу сделать это, используя запрос оракула.

Единственная идея, я был в том, чтобы проверить

select column_name from ALL_TAB_COLUMNS where TABLE_NAME='table' -- but no way to check for value; 

Все предложения с благодарностью.

+0

Не со стандартным SQL - для этого вам понадобится динамический SQL, что, как правило, не очень хорошая идея. Какова бизнес-проблема, которая ведет к этому вопросу? Возможно, есть лучшие подходы. – mathguy

+0

Целью было показать/скрыть поля формы на основе имен столбцов, возвращенных из этого запроса. Но я хочу создать класс, который обрабатывает это для всех страниц, не нужно делать это для каждой страницы. – user1751510

+0

Это странная настройка, но вы пробовали присоединиться к all_tab_columns со своей таблицей «доступа»? Но я согласен с mathguy, скорее всего, лучшим подходом – tbone

ответ

1

Ваш подход неуместен, и есть много способов справиться с вашим сценарием, например, иметь такие свойства, как записи в таблице ACCESS, а не ссылаться на имена столбцов для бизнеса.

Однако вы можете выполнить свой сценарий, используя ниже.

DECLARE 
    columnName varchar(128); 
    sql_stmt VARCHAR2(500); 
    input1 VARCHAR(20); 
    input2 VARCHAR(20); 
BEGIN 
    input1 := '1'; 
    input2 := 'schema_Name'; 
    FOR r IN (select column_name from ALL_TAB_COLUMNS where OWNER = 'DUMMY_TABLE' AND TABLE_NAME='T_PA_CASE' AND DATA_TYPE = 'VARCHAR2') LOOP 
    BEGIN 
    sql_stmt := 'select ' || r.column_name || ' from ' || input2 || '.ACCESS WHERE ' || r.column_name || ' = :1'; 
    EXECUTE IMMEDIATE sql_stmt INTO columnName USING input1; 
    DBMS_OUTPUT.PUT_LINE('First Matched Column is ----'||r.column_name); 
    exit; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    CONTINUE; 
    END; 
    END LOOP; 
END; 

Выход - совпавшее Имя столбца является ---- FIELD0

Вы должны настроить эту функцию и отправить вход для схемы Имени и значения, которое можно сравнить с, чтобы получить вывод имени первого совпадающего столбца.

+0

Спасибо, Шрикант, я попробую. – user1751510