2011-06-03 64 views
4

例如是否有可能有一個動態選擇子句列由subselect定義?

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

的價值有沒有辦法做到這一點在

  • 微軟SQL Sever的2008年? (根據答案,似乎是的)
  • Oracle 11g?

如果是這樣,我該如何在where子句中使用select子句列而不重複子查詢?

+3

老實說,我想不出比動態SQL爲此,我必須說的很多人往往不喜歡,但如果你使用它,請記住使用sp_executesql的和傳遞的參數,以避免SQL注入任何其他方式:-) – 2011-06-03 05:19:07

+0

我想知道的是,爲什麼在運行查詢之前不知道所需的列?也許更好地理解你正試圖解決的問題會幫助我們找到更好的方法來幫助你。 – HLGEM 2011-06-03 19:44:57

回答

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

不,這是不可能的,你需要編寫動態SQL它,需要用於執行查詢「執行」命令。

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 
+0

謝謝!是否還有Oracle解決方案?我需要這兩個數據庫(不幸) – 2011-06-03 19:14:01

1

不完全是你要找的東西,但對於Oracle仍然很有趣。

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將它轉換回單行,但我手邊沒有相應的實例,所以我無法確定。

相關問題