【问题标题】:Calculation in SQL StatementSQL 语句中的计算
【发布时间】:2011-01-06 21:25:16
【问题描述】:

我有一个表,其中包含一个名为 ChannelId 的字段。我想根据值将其分成两个字段。我试过这个:

SELECT CustomerId, ChannelId = 1 as Chan1, ChannelId = 2 as Chan2 FROM ....

目标是我有两个布尔列来表示 ChannelId 字段是否具有适当的值。我收到语法错误。

查看 SQL 语法,我看不出有什么理由不能使用表达式,然后将其别名为新列名,但 SQL Server 对它嗤之以鼻。我做的事情真的很愚蠢吗?怎样才能达到这个效果?

【问题讨论】:

  • 我不明白这个问题。如果列中只有两个值,为什么不将值作为列返回?你想在列上执行一些聚合吗?比如说计算每个值出现了多少次?
  • 否,重新格式化数据以输入到不同的进程。
  • 我认为您需要创建两个松散查询(或通过子查询)。 SQL 的诀窍不是在SELECT 部分提出问题,而是在WHERE 部分提出问题。

标签: sql-server tsql select


【解决方案1】:

你必须执行一个表达式,而不是一个赋值,这取决于他的 SQL 风格。由于您使用的是 SQL Server (T-SQL):

SELECT CustomerId, (CASE WHEN ChannelId = 1 THEN 1 ELSE 0 END) as Chan1, (CASE WHEN ChannelId = 2 THEN 1 ELSE 0 END) as Chan2 FROM ....

可能有更好的方法,但我就是这样做的。

【讨论】:

    【解决方案2】:

    试试:

    select
        CustomerId
      , case when ChannelId = 1 then 1 else 0 end as Channel_1
      , case when ChannelId = 2 then 1 else 0 end as Channel_2
    from Customer_Channel ;
    

    【讨论】:

      【解决方案3】:

      人们已经使用CASE ... WHEN ... THEN 样式声明说明了如何做到这一点,但我只想提供这样的观点,即这相当于在数据库中拥有业务逻辑。通常,我的目标是将数据库纯粹用于存储,并将业务逻辑放在应用程序的更高层中。

      我这样认为是因为如果您认为应用程序具有分层架构,您会将业务逻辑放在一层中,而更深一层或多层将是您的数据库。更高的一层或多层将是您的 UI。 “数据库中的业务逻辑”很糟糕,就像将业务逻辑放在处理程序中以处理表单上的 button_Click 事件一样。

      我很感激这可能不适合您在 2011 年这一天的特定情况,但对于这个问题的未来读者,我希望它有点用处。

      【讨论】:

      • “数据库中的业务逻辑”你能解释为什么这样不好
      • 如果您认为应用程序具有分层架构,您会将业务逻辑放在一层中,而更深一层或多层将是您的数据库。更高的一层或多层将是您的 UI。这很糟糕,就像将业务逻辑放在表单上的button_Click 事件的处理程序中一样糟糕。
      • 无论你能在最底层放什么都是纯粹的好处。我从未使用过 3 层架构,但使用 2 层(客户端-服务器)我会在后端尽可能多地放置业务逻辑。这意味着更安全、更快的应用程序。
      • @Neil 我真的不想成为一个混蛋,但为什么将业务逻辑放在 button_click 中不好。是什么让它“更好”地放在别处。还有什么构成业务逻辑。
      • 这似乎即将爆发为一场关于层级和业务逻辑的典型宗教辩论。当该领域的杰出人物在整个地图上都有建议时,最好考虑一下,选择一个,并在项目中保持一致,同时大量记录任何中断,而不是告诉每个人他们应该做什么。
      猜你喜欢
      • 2021-10-31
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多