Звезда очень похожа на плюс, единственное отличие состоит в том, что, когда плюс соответствует 1 или более предшествующим символу / группе, начало соответствует 0 или более.
Посмотрите на пункт UNPIVOT - я не уверен, что он применим для вашего случая, но в некоторых случаях его можно использовать для запроса значения по имени столбца без динамического SQL:
create table t1 (
a int,
b int,
c int
);
insert into t1 values
(1, 11, 111),
(2, 22, 222),
(3, 33, 333);
select a, col_name, col_value from t1
unpivot (col_value for col_name in (b, c)) as dt;
Результат:
| a | col_name | col_value |
|---|----------|-----------|
| 1 | b | 11 |
| 1 | c | 111 |
| 2 | b | 22 |
| 2 | c | 222 |
| 3 | b | 33 |
| 3 | c | 333 |
( SQL Fiddle )
Если вам нужно только значение в a
в зависимости от какое-либо условие (динамически) либо b
, либо c
, вы можете построить на нем условие. Если вам нужны значения в столбце b
или c
, вы можете добавить ... WHERE col_name = ?
. Если вам нужно больше столбцов, вам, вероятно, нужно будет отфильтровать значения столбцов в таблице без поворота, чем развернуть его снова, чтобы вернуть значения в столбцах.
Один из способов сделать это без использования динамического sql - использовать оператор CASE
Но это уродливо
SELECT EPV.EmployeeCode, case @RateOfEmployee when 'RateOfEmployee' then RateOfEmployee
when 'X' then X
..
end , case @RateOfEmployer when 'RateOfEmployer' then RateOfEmployer
when 'Y' then Y
..
end
FROM [HR_EmployeeProvisions] EPV
Вы должны проверить все столбцы в CASE
.
Вы не можете параметризовать идентификаторы на сервере Sql, и я сомневаюсь, что это возможно в любой другой реляционной базе данных.
Ваш лучший выбор - использовать динамический Sql.
Обратите внимание, что динамический sql очень часто представляет угрозу безопасности, и вы должны защищать свой код от атак sql injection .
Я бы, вероятно, сделал бы что-то вроде этого:
Declare @Sql nvarchar(500)
Declare numberOfColumns int;
select @numberOfColumns = count(1)
from information_schema.columns
where table_name = 'HR_EmployeeProvisions'
and column_name IN(@RateOfEmployee, @RateOfEmployer)
if @numberOfColumns = 2 begin
Select @Sql = 'SELECT EmployeeCode, '+ QUOTENAME(@RateOfEmployee) +' ,'+ QUOTENAME(@RateOfEmployer) +
'FROM HR_EmployeeProvisions'
exec(@Sql)
end
Таким образом, вы убедитесь, что имена столбцов действительно существуют в таблице, а также использование QUOTENAME
в качестве другого уровня безопасности.
Примечание. : в вашем слое презентации вы должны обработать параметр, чтобы выбор не выполнялся, поскольку имена столбцов недействительны.