【问题标题】:Specify the column names in the select clause using a query使用查询在 select 子句中指定列名
【发布时间】:2011-07-15 15:54:23
【问题描述】:

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

 SELECT (SELECT 'ID' 
           FROM DUAL) 
   FROM TABLE_A

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

【问题讨论】:

标签: sql oracle oracle11g dynamic-sql


【解决方案1】:

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

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

  • EXECUTE IMMEDIATE
  • 使用隐式游标

This link provides examples of both.

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

【讨论】:

    【解决方案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;
    

    这会将“whatever”列的内容选择到 v_sql_result 中。 当然,我省略了 WHERE 子句以确保此示例仅返回一行,但您可以自己添加或查找 EXECUTE IMMEDIATE 在 Oracle 中的工作方式。

    【讨论】:

    • 只需阅读 OMG Ponies 的回答,我同意,小心 SQL 注入,所以请仔细编写动态 SQL。
    【解决方案3】:

    如果您想要动态的列列表,最好使用动态 sql。我尽量避免使用它,但这是何时使用它的一个典型例子。

    示例:

    声明@sqlQuery varchar(300)

    SET @sqlQuery = '选择'

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

    SET @sqlQuery = @sqlQuery + ' from TABLE_A where '

    执行(@sqlQuery)

    这至少是你的起点。

    【讨论】:

    • 这是 SQL Server 语法,而不是 Oracle(问题已标记)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多