是否可以使用subselect定义的动态select子句列?

时间:2011-06-03 05:12:39

标签: sql sql-server-2008 oracle11g subquery

例如

SELECT (SELECT col_name FROM column_names WHERE col_id = 1) FROM my_table

它返回col_name的值而不是table.col_name的值 例如如果col_name是x1,则上面的选择将返回“x1”而不是SELECT x1 FROM my_table的值

有没有办法在

中完成
  • Microsoft SQL Sever 2008? (根据答案,似乎是)
  • Oracle 11g?

如果是,如何在不重复子选择的情况下使用where子句中的select子句列?

4 个答案:

答案 0 :(得分:2)

在SQL Server中,您可以使用动态SQL,如下所示:

declare @TableName sysname = quotename('Test')

declare @ColumnList varchar(max)

select @ColumnList = isnull(@ColumnList + ', ', '') + quotename(name)
from sys.columns
where object_name(object_id) = @TableName

declare @SqlCommand varchar(max) = 'select ' + @ColumnList + ' from ' + @TableName 
execute(@SqlCommand)

答案 1 :(得分:1)

不可能,您需要为它编写Dynamic sql并需要使用“Execute”命令来执行查询。

答案 2 :(得分:1)

DECLARE @column nvarchar(100), @query nvarchar(max)
SET @column = (SELECT [col_name] FROM column_names WHERE col_id = 1)
SET @query = 'SELECT ' + QUOTENAME(@column) + ' FROM [my_table]'
EXEC sp_executesql @query

答案 3 :(得分:1)

不完全是您正在寻找的东西,但对甲骨文来说仍然很有趣。

WITH t AS
 (SELECT 'one' column_one, 'two' column_two, 'three' column_three FROM dual)
SELECT XMLTYPE(EXTRACT(VALUE(T), '/*').GETSTRINGVAL()).GETROOTELEMENT() VALUE
  FROM TABLE(XMLSEQUENCE(XMLTYPE((CURSOR (SELECT * FROM t))).EXTRACT('/ROWSET/ROW/*'))) T;

基本上,您将生成的列转换为XML,然后解析标记名称;因此,此示例将为您提供以下输出。

VALUE
-----------
COLUMN_ONE
COLUMN_TWO
COLUMN_THREE

如果您的原始查询返回多行,那么您将上面的结果集乘以行数。

我相信您可以在11g中使用PIVOT将其转换回单行,但我手动没有相应的实例,所以我无法确定。