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)
我需要:
- 如果所有条件 return OK 我必须为 ID 号 161016 更新我的 table 的 ALS 列,其值为 OK。
- 如果至少有一个 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 实际值。
我尝试使用 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)
我需要:
- 如果所有条件 return OK 我必须为 ID 号 161016 更新我的 table 的 ALS 列,其值为 OK。
- 如果至少有一个 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 实际值。