【问题标题】:Can I use column name as a parameter in case statement我可以在case语句中使用列名作为参数吗
【发布时间】: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] 的列的值?

标签: sql sql-server tsql


【解决方案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
      

      我不得不承认,我不明白(或者)你想要做什么......这样你无论如何都必须对列名进行硬编码,这引发了一个问题,为什么你没有这样做开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 2023-04-05
        • 2012-05-02
        • 2011-02-24
        • 2017-11-25
        相关资源
        最近更新 更多