выберите столбец, в котором имя столбца извлекается из запроса - PullRequest
2 голосов
/ 04 января 2011

Я ищу элегантный способ выбора столбца из таблицы A, в котором имя столбца извлекается из запроса к таблице B.

Запрос к таблице B приводит к 'col01' ТаблицаA имеет несколько столбцов с именем 'col01','col02','col03',...

Окончательный запрос должен быть для результата

result from B | effective SQL query
 'col01'      |  SELECT col01 FROM A
 'col02'      |  SELECT col02 FROM A

Я ищу решение чистого SQL без сценариев.Он должен работать с Oracle и / или MySQL.

Ответы [ 3 ]

7 голосов
/ 04 января 2011

Я ищу решение чистого SQL без сценариев.

Это невозможно. Вы должны создавать заявления динамически.

0 голосов
/ 04 января 2011

Это может быть сделано в хранимой подпрограмме в MySQL. Я не знаю об Oracle, поскольку я не использовал его. Вы можете узнать больше о хранимых процедурах MySQL здесь и здесь (2-ая ссылка - довольно хороший PDF-файл, содержащий несколько простых примеров).

0 голосов
/ 04 января 2011

В очень простом случае вы можете просто сделать это с помощью оператора CASE, но это вряд ли будет полезным в реальном мире:

with a as (
    select 'col_01_val_01' as col_01, 'col_02_val_01' as col_02,
        'col_03_val_01' as col_03 from dual
    union select 'col_01_val_02' as col_01, 'col_02_val_02' as col_02,
        'col_03_val_02' as col_03 from dual
    union select 'col_01_val_03' as col_01, 'col_02_val_03' as col_02,
        'col_03_val_03' as col_03 from dual),
b as (
    select 1 parm, 'col_01' value from dual
    union select 2 parm, 'col_02' value from dual
    union select 3 parm, 'col_03' value from dual)
select b.value as result_from_b,
    case b.value
        when 'col_01' then col_01
        when 'col_02' then col_02
        when 'col_03' then col_03 end as result_from_a
from a, b
where b.parm = 1;

RESULT_FROM_B RESULT_FROM_A
------------- -------------
col_01        col_01_val_01
col_01        col_01_val_02
col_01        col_01_val_03

Столбцы должны быть одного типа (или, по крайней мере, выраженными как таковые в данном случае), и b может возвращать только одну строку ... И это, конечно, не очень красиво.Для чего-то более сложного вам нужен динамический SQL, как уже предложено @a_horse_with_no_name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...