【问题标题】:Are there any syntax errors in this case statement? Language = SQL Server这个 case 语句中是否有任何语法错误?语言 = SQL Server
【发布时间】:2020-03-20 23:39:09
【问题描述】:
case ('monthcharge' <> 0)
WHEN TRUE THEN 'monthcharge' * datediff(mm,, 'start', 'stop')
WHEN FALSE THEN case ('weekcharge' <>0)
                    WHEN TRUE THEN 'weekcharge' * datediff(ww, 'start', 'stop')
                    WHEN FALSE THEN 'daycharge' * datediff(dd, 'start', 'stop') 
                    ELSE 0
                    END
ELSE 0
END 'final_total'

数据类型:

alias       | datatype
daycharge   | float
weekcharge  | float
monthcharge | float
start       | datetime
stop        | datetime

【问题讨论】:

  • 比较字符串和数字没有意义。
  • 在 SQL Server 上运行时,是否提示语法错误?这似乎是一个很容易回答的问题。
  • CASE 表达式。运行查询时是否遇到任何错误?如果是,那么是,如果不是,那么不是。

标签: sql-server datetime case alias boolean-expression


【解决方案1】:

对字符串常量使用单引号。如果您将关键字作为对象名称,则应使用 方括号 转义它们

这是您尝试做的更好的版本

SELECT final_total = CASE 
                       WHEN monthcharge <> 0 THEN monthcharge * Datediff(mm, [start], [stop]) 
                       WHEN weekcharge <> 0 THEN weekcharge * Datediff(ww, [start], [stop]) 
                       WHEN daycharge <> 0 THEN daycharge * Datediff(dd, [start], [stop]) 
                       ELSE 0 
                     END 

【讨论】:

    【解决方案2】:

    问题是你把你的列名放在引号里——你想把那些引号去掉。

    您还必须为您的测试做出选择——如果您只打算使用两个选择,则无需像这样的 case 语句。

    这里是固定代码。

    case WHEN monthcharge <> 0.0 TRUE THEN monthcharge * datediff(mm,, 'start', 'stop')
         ELSE case WHEN weekcharge <> 0.0 THEN weekcharge * datediff(ww, 'start', 'stop')
                   ELSE daycharge * datediff(dd, 'start', 'stop') 
              END
    END AS final_total
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多