例如
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
的值
有没有办法在
中完成如果是,如何在不重复子选择的情况下使用where子句中的select子句列?
答案 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
将其转换回单行,但我手动没有相应的实例,所以我无法确定。