Mysql 用户定义的变量在 0 时不更新
Mysql user-defined variable not updating when 0
对于数据分析项目,我需要按照以下格式拆分 table 涉及日期的员工时间表:
Employee|Start_Days|End_Days|...
0001|0|7|...
0001|7|14|...
0001|14|21|...
0002|0|7|...
0002|14|21|...
...
对于这两列,我在 CASE 语句中使用用户定义的变量@cur_Count。
...
(
CASE
e.EMPLOYEE
WHEN
@cur_Employee
THEN
@cur_Count := @cur_Count + 1
ELSE
@cur_Count := 1
AND @cur_Employee := e.EMPLOYEE
END
) * 7 AS START_DAYS,
(@cur_Count + 1) * 7 AS END_DAYS,
...
FROM
tmp_MS_Relevant_Employees AS e,
hlp_MS_Calendar_Weeks AS c,
(SELECT @cur_Employee = '', @cur_Count := 0) AS init
WHERE
...
这个语句工作得很好——除了一点例外(因为@cur_Count 在 ELSE 子句中被重置为 1)员工的第一个条目从第 7 天而不是第 0 天开始。
但是,如果我使用以下之一
@cur_Count := 0
@cur_Count := @cur_Count * 0
@cur_Count := @cur_Count - @cur_Count
或以任何其他方式将变量重置为 0,输出如下所示:
Employee|Start_Days|End_Days|...
0001|0|7|...
0001|0|7|...
0001|0|7|...
显然,变量在重置为 0 后会忽略任何更新其值的尝试。虽然这个问题很容易解决,但它仍然令人费解(而且解决方法并不整洁)。我在这里遗漏了什么或者这是 MySql 的错误吗?
提前感谢您的任何反馈!
将 AND
表达式的顺序切换为
(@cur_Employee := e.EMPLOYEE)
AND (@cur_Count := 0)
这是因为AND
进行了短路。当您分配 0
时,它被视为 FALSE
,因此它不会执行分配。
另一种选择是在乘法之后减去 7
:
(
CASE
e.EMPLOYEE
WHEN
@cur_Employee
THEN
@cur_Count := @cur_Count + 1
ELSE
(@cur_Count := 1)
AND (@cur_Employee := e.EMPLOYEE)
END
) * 7 - 7 AS START_DAYS,
对于数据分析项目,我需要按照以下格式拆分 table 涉及日期的员工时间表:
Employee|Start_Days|End_Days|...
0001|0|7|...
0001|7|14|...
0001|14|21|...
0002|0|7|...
0002|14|21|...
...
对于这两列,我在 CASE 语句中使用用户定义的变量@cur_Count。
...
(
CASE
e.EMPLOYEE
WHEN
@cur_Employee
THEN
@cur_Count := @cur_Count + 1
ELSE
@cur_Count := 1
AND @cur_Employee := e.EMPLOYEE
END
) * 7 AS START_DAYS,
(@cur_Count + 1) * 7 AS END_DAYS,
...
FROM
tmp_MS_Relevant_Employees AS e,
hlp_MS_Calendar_Weeks AS c,
(SELECT @cur_Employee = '', @cur_Count := 0) AS init
WHERE
...
这个语句工作得很好——除了一点例外(因为@cur_Count 在 ELSE 子句中被重置为 1)员工的第一个条目从第 7 天而不是第 0 天开始。
但是,如果我使用以下之一
@cur_Count := 0
@cur_Count := @cur_Count * 0
@cur_Count := @cur_Count - @cur_Count
或以任何其他方式将变量重置为 0,输出如下所示:
Employee|Start_Days|End_Days|...
0001|0|7|...
0001|0|7|...
0001|0|7|...
显然,变量在重置为 0 后会忽略任何更新其值的尝试。虽然这个问题很容易解决,但它仍然令人费解(而且解决方法并不整洁)。我在这里遗漏了什么或者这是 MySql 的错误吗?
提前感谢您的任何反馈!
将 AND
表达式的顺序切换为
(@cur_Employee := e.EMPLOYEE)
AND (@cur_Count := 0)
这是因为AND
进行了短路。当您分配 0
时,它被视为 FALSE
,因此它不会执行分配。
另一种选择是在乘法之后减去 7
:
(
CASE
e.EMPLOYEE
WHEN
@cur_Employee
THEN
@cur_Count := @cur_Count + 1
ELSE
(@cur_Count := 1)
AND (@cur_Employee := e.EMPLOYEE)
END
) * 7 - 7 AS START_DAYS,