【问题标题】:Is it possible to call sql function after case statement endcase语句结束后是否可以调用sql函数
【发布时间】:2023-03-04 22:34:01
【问题描述】:

我试图在 case 语句结束后调用 sql 函数但出现错误。 我在以下 sql 查询中遇到错误。

SELECT IsNULL(CONCAT(emp.FirstName,' ',emp.MiddleName,' ',emp.LastName),'-') 
    EmployeesName,
       dbo.EmployeeScheduleTime(scdle.StartTime,scdle.EndTIme),
       case dbo.GetDayName(scdle.Date)
         when 'Tuesday' then 
          dbo.EmployeeScheduleTime(scdle.StartTime,scdle.EndTIme)  
         else Null
          END dbo.GetDayNameWithDate(scdle.Date)
           FROM Employee emp Left outer join Department dpt on 
            emp.DepartmentID=dpt.DepartmentID
                  inner join Shift shft on shft.ShiftID=emp.ShiftID
                  left outer join Schedule scdle on 
                   scdle.ShiftID=shft.ShiftID

【问题讨论】:

  • 您使用的是 Oracle 吗?如果是,是否可以从您这边切换到 plsql 来实现您想要的?
  • 您提到了 MySQL 和 Oracle。但是dbo.whatever 是 Microsoft SQL Server 的东西。所以....你使用什么 dbms?

标签: mysql sql sql-server


【解决方案1】:

WHEN ... THEN ... ELSE ... END 之后的内容是您的结果集的列别名。列别名必须是常量,不能是函数的结果。

所以你需要这样的东西

   case dbo.GetDayName(scdle.Date)
     when 'Tuesday' then 
         dbo.EmployeeScheduleTime(scdle.StartTime,scdle.EndTIme)  
     else Null
     END Tuesday

【讨论】:

  • 您可能想要调查旋转操作。 stackoverflow.com/questions/tagged/pivot 或者您可能希望使用 php、c#、java 等编程语言来格式化您的输出。你想做的事情在纯 SQL 中是非常困难的。而且,即使你成功了,它也不能在数据库服务器的品牌和型号之间移植。
【解决方案2】:

看起来您可能在 CASE END 后忘记了一个逗号。

...END,dbo.GetDayNameWithDate(scdle.Date)

否则,如果您希望将其用作别名,则上面的 O.Jones 是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多