Можно ли иметь столбцы с предложением динамического выбора, определяемые подвыбором? - PullRequest
4 голосов
/ 03 июня 2011

Например,

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?

Если это так, как я могу использовать столбцы предложения select в предложении whereне повторяя подвыбор?

Ответы [ 4 ]

2 голосов
/ 03 июня 2011

В 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 голос
/ 03 июня 2011

Не совсем то, что вы ищете, но все же интересно для 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

Если ваш исходный запрос возвращает более одной строки, то полученный выше результат будет умножен на количество строк.

Я полагаю, что вы можете использовать PIVOT в 11g, чтобы преобразовать его обратно в один ряд, но у меня нет соответствующего экземпляра вручную, поэтому я не могу точно сказать.

1 голос
/ 03 июня 2011
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
1 голос
/ 03 июня 2011

Нет, это невозможно, вам нужно написать Dynamic SQL для этого и использовать команду «Выполнить» для выполнения запроса.

...