我可以在case语句中使用列名作为参数吗
Posted
技术标签:
【中文标题】我可以在case语句中使用列名作为参数吗【英文标题】:Can I use column name as a parameter in case statement 【发布时间】:2019-08-25 08:36:52 【问题描述】:我想在 case 语句中使用列名的值作为参数。
我拥有的列名是数字,我想对列名进行一些计算并根据结果返回 [value] 或 [null]。
我在 SQL Server 的视图中执行此操作。
例如,假设 2013 是列的名称,而 year([some date]) = 2016 那么 [New Column] 应该等于 0。
SELECT CASE WHEN [2013] < year([some date]) then 0 else [2013] END AS [New Column]
【问题讨论】:
确定你可以... 不太清楚你在这里问什么。作为 DDL+DML 的样本数据和期望的结果将使这个问题更容易理解。 我的问题是我想在case语句中使用列名的值作为参数。所以列的名称是 2013 更大的问题是,你为什么想要这样做? 所以,在您的示例中,您说 [2013],您希望它具有数字 2013 而不是名为 [2013] 的列的值? 【参考方案1】:是的,这是可能的:T-SQL documentation about case statements
虽然将列名命名为数字看起来有点脏,但我建议不要这样做。这实际上可能是你的问题。见this answer
【讨论】:
【参考方案2】:根据问题的 cmets,您正在寻找这样的东西(伪代码 - 不起作用!):
SELECT CASE WHEN CAST(NAME_OF([2013]) AS INT) < year([some date]) THEN 0 ELSE [2013] END AS [New Column]
FROM [TableName]
伪函数NAME_OF
返回对象的名称。
但是,SQL Server 不包含这样的函数(它确实有 object_name
,但它接受一个表示对象 id 的 int,并且要获取对象 id,您需要知道对象的名称,所以这无济于事非常多,而且无论如何表列都没有对象 id,它们的 id 是它们的包含表 id 和它们的列 id 的组合。
不过,你可以这样做:
SELECT CASE WHEN 2013 < year([some date]) THEN 0 ELSE [2013] END AS [New Column]
FROM [TableName]
如果[some date]
早于 2013 年,则返回 0,否则返回存储在名为 2013
的列中的值。
【讨论】:
【参考方案3】:继续 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
我不得不承认,我不明白(或者)你想要做什么......这样你无论如何都必须对列名进行硬编码,这引发了一个问题,为什么你没有这样做开始。
【讨论】:
以上是关于我可以在case语句中使用列名作为参数吗的主要内容,如果未能解决你的问题,请参考以下文章
SQL里if语句和case语句有啥区别吗?哪个使用更高效?就是查询更优化?