我可以在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语句中使用列名作为参数吗的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用带有两个变量的 case/switch 语句吗?

再看case语句

多case语句中的别名列名

SQL里if语句和case语句有啥区别吗?哪个使用更高效?就是查询更优化?

是否可以在 java switch/case 语句中使用类名? [复制]

使用 Case 语句字段填充参数