【问题标题】:Use one conditional function with more than one execution path if condition is met如果满足条件,则使用具有多个执行路径的条件函数
【发布时间】:2021-12-10 02:55:15
【问题描述】:

我有以下case语句,

 case WHEN
           DATE(DATE_SUB(DATE_ADD(startDate, INTERVAL 6 MONTH),INTERVAL 1 WEEK)) = DATE(NOW()) THEN
     CONCAT('You should by now have held a probationary review meeting.','You must get approval from the owners.') 
    END AS 'emailSentence'

emailSentence 将连接两个句子。这个 emailSentence 被另一个程序从外部引用。

我想使用不同的别名,例如 emailSentence2 并参考 concat 的第二部分,即 '您必须得到所有者的批准。' 都在同一个 case 语句中。这意味着摆脱 concat 这很好。有没有办法做到这一点?如果有一种方法可以在不使用 case 语句的情况下执行此操作,我也很乐意听到,但它需要是条件语句/函数。

我确实意识到我可以在相同的条件下使用不同的 case 语句,但这意味着多个 case 语句会使 sql 臃肿。

【问题讨论】:

  • 变量是一个选项吗?选择句子作为变量,句子2按第一个点分割变量并取第二部分

标签: mysql mysql-8.0


【解决方案1】:

SQL 具有非常严格的语法。 * 是唯一的例外,在 SELECT 中列出一列总是看起来像

select ... , expression [[as] alias], ...

case 将成为expression 的一部分,因此它不能跨越多列,也不能添加/返回多列。

轶事,SQL 不太关心代码是否简短。例如,不允许执行select <expression> as value1, <expression> as value2, value1+value2 as value3select <expression> as value ... where value=0 之类的操作,您必须重复这些表达式。

不过,如果您真的不想重复该表达式,您可以改用left join 并将比较(一次)作为on-条件:

select ..., e.emailSentence, e.emailSentence2 -- or just e.*
from ...
left join (
  select 
    'You should by now have held a probationary review meeting.' as emailSentence,
    'You must get approval from the owners.' AS emailSentence2
) e on DATE(DATE_SUB(DATE_ADD(startDate, INTERVAL 6 MONTH),INTERVAL 1 WEEK)) = DATE(NOW()) 

澄清一下:如果on-条件不成立,则值将是null,就像case-版本一样。

此解决方案有其自身的局限性,但可能是您的一个选择。

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2021-11-28
    • 2013-08-08
    • 2012-01-24
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2021-01-28
    • 2021-06-06
    相关资源
    最近更新 更多