MySQL IF() 函数根据指定条件执行代码块

MySQL IF() function to execute a block of code based on a specified condition

我尝试使用 MySQL IF() function 根据指定条件执行代码块。

Return "KO" 如果条件为 TRUE,或 "OK" 如果条件为 FALSE.

下面说明了IF() function的语法:

SELECT
id,
IF(DATEDIFF( Date_PEC, Date_Start ) > 30, "KO", "OK") DateDiff_1,
IF(DATEDIFF( Date_PEC, Data_Analysis ) > 45, "KO", "OK") DateDiff_2,
IF(DATEDIFF( Data_Analysis, Date_communication ) > 30, "KO", "OK") DateDiff_3,
IF(DATEDIFF( Date_communication, Date_of_issue ) > 30, "KO", "OK") DateDiff_4,
IF(DATEDIFF( Data_Analysis, Date_Archiving ) > 30, "KO", "OK") DateDiff_5,
IF(DATEDIFF( Date_of_issue, Date_Payment ) > 30, "KO", "OK") DateDiff_6 
FROM `dotable` 
WHERE
 id = 161016;

+--------+------------+------------+------------+------------+------------+------------+
| id     | DateDiff_1 | DateDiff_2 | DateDiff_3 | DateDiff_4 | DateDiff_5 | DateDiff_6 |
+--------+------------+------------+------------+------------+------------+------------+
| 161016 | OK         | OK         | OK         | OK         | OK         | OK         |
+--------+------------+------------+------------+------------+------------+------------+
1 row in set (0.16 sec)

我需要:

  1. 如果所有条件 return OK 我必须为 ID 号 161016 更新我的 table 的 ALS 列,其值为 OK。
  2. 如果至少有一个 returned 值是 KO,我必须更新 ID 号 161016 的 ALS 列 table 和 KO 值。

mysql数据库的版本是8.0.12。

有什么建议吗?

UPDATE dotable
SET als = CASE WHEN (DATEDIFF( Date_PEC, Date_Start ) > 30) 
                  + (DATEDIFF( Date_PEC, Data_Analysis ) > 45) 
                  + .. 
                  + (DATEDIFF( Date_of_issue, Date_Payment ) > 30)
                THEN 'KO'
                ELSE 'OK'
                END
WHERE id = 161016;

Single (DATEDIFF( Date_PEC, Date_Start ) > 30) returns 0 或 1 取决于条件是 FALSE 还是 TRUE。

当所有 6 个值都为零时,总和为零,它被视为 FALSE,这导致 OK 分配。

当至少有一个值不为零时,则总和大于零,它被视为 TRUE,这导致 KO 分配。

如果某个日期值为 NULL(或者该值不是日期并且禁用了严格模式),则将分配 OK

PS。我更愿意为 als 列使用生成的列,而不是显式更新的列 - 在这种情况下,您将始终 select 实际值。