我有一个SQL查询,我想在其中动态指定列的名称
假设我有一个名为TABLE_A
的表,它有一个名为ID
的列。我想知道我是否可以做类似的事情:
SELECT (SELECT 'ID'
FROM DUAL)
FROM TABLE_A
显然这是不可能的。有更好的方法吗?
答案 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)
这至少是一个适合你的地方。