MySQL 列别名上的 CASE 语句

MySQL CASE statement on a column alias

我正在对列执行 IF 并为结果指定别名。使用别名的 CASE 语句不起作用(错误 - sessionDate 在字段列表中不存在)。但是,如果我将别名替换为列名,它确实有效。请问我该如何解决这个问题?

MySQL(如果我在 CASE 语句中使用 csm_pat_exe_date.pedate_date 它有效):

IF (csm_pat_exe_date.pedate_date IS NULL, ses_date, csm_pat_exe_date.pedate_date) AS sessionDate,
CASE WHEN DAYOFWEEK(sessionDate) = 1 THEN 'Sun'
    WHEN DAYOFWEEK(sessionDate) = 2 THEN 'Mon'
    WHEN DAYOFWEEK(sessionDate) = 3 THEN 'Tue'
    WHEN DAYOFWEEK(sessionDate) = 4 THEN 'Wed'
    WHEN DAYOFWEEK(sessionDate) = 5 THEN 'Thu'
    WHEN DAYOFWEEK(sessionDate) = 6 THEN 'Fri'
    WHEN DAYOFWEEK(sessionDate) = 7 THEN 'Sat'
    ELSE ''
END AS weekday,

select-列表中的表达式不能引用同一select-列表中定义的别名。技术上没有定义表达式的求值顺序,因此任何表达式都不能依赖于同一列表中的另一个表达式。

您可以重复别名所基于的表达式:

CASE WHEN DAYOFWEEK(IF (
  csm_pat_exe_date.pedate_date IS NULL, 
  ses_date, 
  csm_pat_exe_date.pedate_date)) = 1 THEN 'Sun'
...

但您必须在每个 WHEN 子句中重复相同的 IF() 表达式。

或者你可以在子查询中定义别名,然后外部查询可以引用别名

SELECT CASE WHEN DAYOFWEEK(t.sessionDate) = 1 THEN 'Sun' 
      WHEN DAYOFWEEK(t.sessionDate) = 2 THEN 'Mon'
  ... END AS weekday
FROM (
  SELECT IF (
    csm_pat_exe_date.pedate_date IS NULL, 
    ses_date, 
    csm_pat_exe_date.pedate_date) AS sessionDate
  ...
) AS t