使用查询在select子句中指定列名

时间:2011-07-15 15:54:23

标签: sql oracle oracle11g dynamic-sql

我有一个SQL查询,我想在其中动态指定列的名称 假设我有一个名为TABLE_A的表,它有一个名为ID的列。我想知道我是否可以做类似的事情:

 SELECT (SELECT 'ID' 
           FROM DUAL) 
   FROM TABLE_A

显然这是不可能的。有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

SQL不支持动态列或表名 - 您需要使用动态SQL来获得所需的功能。动态SQL意味着在将字符串(包含查询)提交给数据库进行解释之前构造一个字符串,并根据需要进行连接。

大多数数据库都支持动态SQL,但语法通常非常不同。 Oracle提供:

  • EXECUTE IMMEDIATE
  • 使用隐式光标

This link provides examples of both

为免我们忘记Little Bobby Tables,动态SQL增加了SQL注入攻击的风险......

答案 1 :(得分:2)

如果您在PL / SQL环境中,则可以使用动态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中选择列“whatever”的内容。 当然,我省略了WHERE子句以确保此示例只返回了一行,但您可以自己添加或查找EXECUTE IMMEDIATE在Oracle中的工作方式。

答案 2 :(得分:-1)

如果需要动态列列表,最好使用动态sql。我尽可能地避免它,但这是何时使用它的一个主要例子。

示例:

DECLARE @sqlQuery varchar(300)

SET @sqlQuery ='select'

------逻辑循环发生----- SET @sqlQuery = @sqlQuery +'columnname,' ------结束循环------

在TABLE_A中设置@sqlQuery = @sqlQuery +',其中'

EXEC(@sqlQuery)

这至少是一个适合你的地方。