2016-10-21 1 views
1

Что мне нужно сделать, это вычисляемый столбец в соответствии со значениями, возвращаемые другим полем:Выберите значение поля в соответствии с именем поля, хранящегося в другом поле

Supose:

declare @t TABLE (
    code varchar(5), 
    address varchar(20), 
    result_type varchar(1), 
    result varchar(50) 
) 

insert into @t values ('0001', '', 'L', 'DFK-2020') 
insert into @t values ('0001', '', 'F', 'code') 
insert into @t values ('0001', '214, Samuel St', 'F', 'address') 

Что мне нужно, это выбрать заявление возвращения:

DFK-2020 
0001 
214, Samuel St. 

Единственное, что я могу думать:

select 
case 
    when result_type = 'L' then result 
    when result_type = 'F' then (result) -- -> ????? 
end as ret_values 

Я заблудился в ????. я должен выбрать поле в соответствии с тем, что хранится в другом поле

Что-то вроде: «Когда„result_type“есть„F“, пожалуйста, выберите значение, хранящееся в поле, имя которого хранится в„результате“»

на других языках/сценариях, которые я использовал для достижения этой цели с «макро ссылки» .Something как:

select &(result) from ... 

Как я могу добиться того, что в SQL Server 2008?

+0

Как вы планируете получать все данные, чтобы иметь один тип данных? Тип данных одного столбца не может меняться от одной строки к другой. fyi: Если вы планируете использовать динамический SQL, тогда изучите [SQL Injection] (http://bobby-tables.com/). – HABO

ответ

0

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

что-то вроде этого:

select 
    (select result from t where result_type = 'L') as fieldName1, 
    (select result from t where result_type = 'F') as fieldName2, 
    . 
    . 
    . 
1

Один из способов:

select *, 
    case result_type 
     when 'L' then result 
     when 'F' then 
      case result 
       when 'code' then code 
       when 'address' then address 
      end 
     end 
from @t 
+0

проблема в том, что таблица имеет 150 полей ... – user3770963

0
SELECT 
    CASE result_type 
     WHEN 'L' THEN result 
     WHEN 'F' THEN 
      CASE result 
       WHEN 'code' THEN code 
       WHEN 'address' THEN address 
       -- and so on 
      END 
    END AS ret_values 
+0

Проблема в том, что таблица имеет более 150 полей – user3770963

+0

@ user3770963 Тогда вам придется написать 150 'WHEN ...' частей. Нет другого способа, чем это сделать. –

+0

@ user3770963 Однако вы можете превратить это в динамический запрос, проверив определение таблицы и создав динамический запрос на основе результатов. См. [Здесь] (http://stackoverflow.com/a/1054988/243373) о том, как получить имена столбцов для таблицы. Чтобы создать динамический запрос, постройте запрос в 'NVARCHAR (MAX)' (например, @query) и выполните его с помощью ['EXEC sp_executesql @ sql'] (https://msdn.microsoft.com/en-us/library /ms188001.aspx) –