Укажите имена столбцов в предложении выбора, используя запрос - PullRequest
2 голосов
/ 15 июля 2011

У меня есть SQL-запрос, в котором я хочу динамически указывать имена столбцов.
Допустим, у меня есть таблица с именем TABLE_A и столбец с именем ID. Мне было интересно, могу ли я сделать что-то вроде:

 SELECT (SELECT 'ID' 
           FROM DUAL) 
   FROM TABLE_A

Очевидно, что это невозможно. Есть ли лучший способ для этого?

Ответы [ 3 ]

6 голосов
/ 15 июля 2011

SQL не поддерживает динамические имена столбцов или таблиц - вам нужно использовать динамический SQL, чтобы получить желаемую функциональность. Динамический SQL означает построение строки с конкатенацией при необходимости перед отправкой строки (содержащей запрос) в базу данных для интерпретации.

Динамический SQL поддерживается большинством баз данных, но синтаксис часто сильно отличается. Oracle предоставляет:

  • EXECUTE IMMEDIATE
  • с использованием неявного курсора

Эта ссылка содержит примеры обоих .

Чтобы не забыть Таблицы Бобби , динамический SQL - это повышенный риск атак SQL-инъекций ...

2 голосов
/ 15 июля 2011

Вы можете использовать динамический SQL, если вы находитесь в среде PL / SQL.

Создайте строку SQL как VARCHAR2 перед ее выполнением.

DECLARE
  v_sql VARCHAR2(4001);
  v_column VARCHAR2(30) := 'whatever';
  v_sql_result VARCHAR2(4001);
BEGIN
  v_sql := 'SELECT '||v_column||' FROM table_a';

  EXECUTE IMMEDIATE v_sql
  INTO v_sql_result;
EXCEPTION
  WHEN ...
  THEN
      ...
END;

Это выберет содержимое столбца «что угодно» в v_sql_result. Конечно, я пропустил предложение WHERE, чтобы гарантировать, что для этого примера была возвращена только одна строка, но вы можете добавить это самостоятельно или посмотреть, как EXECUTE IMMEDIATE работает в Oracle.

0 голосов
/ 15 июля 2011

Если вам нужен динамический список столбцов, вам лучше использовать динамический sql.Я стараюсь избегать этого всякий раз, когда могу, но это яркий пример того, когда его использовать.

пример:

DECLARE @sqlQuery varchar (300)

SET @sqlQuery = 'select'

------ происходит логический цикл ----- SET @sqlQuery = @sqlQuery + 'columnname,' ------ конец цикла ------

SET @sqlQuery = @sqlQuery + 'из TABLE_A, где'

exec (@sqlQuery)

Это как минимум место для вас.

...