Sql 我可以在case语句中使用列名作为参数吗

Sql 我可以在case语句中使用列名作为参数吗,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想在case语句中使用列名的值作为参数 我拥有的列名是数字,我想对列名进行一些计算,并根据结果返回[value]或[null] 我是在SQL Server上的视图中执行此操作的 例如,假设2013是该列的名称,年份([某个日期])=2016,则[新列]应等于0 SELECT CASE WHEN [2013] < year([some date]) then 0 else [2013] END AS [New Column] 在[2013]

我想在case语句中使用列名的值作为参数

我拥有的列名是数字,我想对列名进行一些计算,并根据结果返回[value]或[null]

我是在SQL Server上的视图中执行此操作的

例如,假设2013是该列的名称,年份([某个日期])=2016,则[新列]应等于0

SELECT CASE WHEN [2013] < year([some date]) then 0 else [2013] END AS [New Column]
在[2013]
是,这是可能的:


用数字命名列名看起来有点脏,我建议不要这样。这实际上可能是你的问题。请参见

根据对问题的评论,您正在寻找类似的内容(伪代码-不起作用!):


如果
[some date]
在2013年之前,则返回0,否则将返回名为
2013的列中存储的值。

继续Zohar Peled的综述,我可以想出一种方法。特别是因为您还选择了标记tsql

declare @colname nvarchar(4) = '2013'
declare @statement nvarchar(4000) = N'SELECT CASE WHEN ' + @colname + N' < year([some date]) then 0 else [' + @colname + N'] END AS [New Column]'
exec sp_executesql @statement
declare@colname-nvarchar(4)='2013'
声明@statement nvarchar(4000)=N'SELECT CASE WHEN'+@colname+N'

我不得不承认,我也不明白你想做什么。。。这样,您就必须硬编码列名,这就提出了一个问题,为什么您从一开始就没有这样做。

当然可以……不太确定您在问什么。作为DDL+DML的示例数据和期望的结果将使这个问题更容易理解。我的问题是,我想在case语句中使用列名的值作为参数。因此,该列的名称为2013更大的问题是,您为什么要这样做?因此,在您的示例中,您说[2013],您希望该列的编号为2013,而不是名为[2013]的列的值?
SELECT CASE WHEN 2013 < year([some date]) THEN 0 ELSE [2013] END AS [New Column]
FROM [TableName]
declare @colname nvarchar(4) = '2013'
declare @statement nvarchar(4000) = N'SELECT CASE WHEN ' + @colname + N' < year([some date]) then 0 else [' + @colname + N'] END AS [New Column]'
exec sp_executesql @statement