在同一条SQL语句中对重复的行应用CASE表达式
我在做每周排班表。已经使用这段代码把SQL数据库表中的一行数据复制了一份:
$test = "2026-03-02";
$sql = "INSERT INTO myrota (weekstart, shift, employid, name, mon, tue)
SELECT weekstart, shift, employid , name, mon, tue
FROM myrota
where weekstart = '$test'";
我已经修改上面的代码,在下方加入了SQL CASE,如下所示,这样我就可以对 "weekstart" 列应用一个条件。我想设定一个条件:
- 如果数据库中的weekstart日期等于 $dateone变量,则应用 $datethree变量
- 或者如果数据库中的weekstart日期等于 $datetwo变量,则应用 $datefour变量。
修改将应用到已复制的那一行。自从我添加修改后,代码完全不起作用。
$dateone = "2026-03-02";
$datetwo = "2026-03-09";
$datethree ="2026-03-16";
$datefour = "2026-03-23";
$sql = "INSERT INTO myrota (weekstart)
SELECT weekstart,
CASE
WHEN weekstart= '$dateone' THEN '$datethree'
WHEN weekstart= '$datetwo' THEN '$datefour'
ELSE 'empty'
END AS weekstart
FROM myrota ";
解决方案
问题出现在你新的SQL语句上,具体如下:
在这个子句中...
INSERT INTO myrota (weekstart)
...你告诉它要插入 一个 列,但你的 SELECT 语句却包含 两个 列(两者都使用相同的别名!):
在执行时应该会产生一个SQL错误
列数与值数不匹配
演示: https://dbfiddle.uk/-HgFidNC。如果你没有看到这个错误,那么要么a) 你其实没有执行该查询,或者b) 出于某种原因你屏蔽了错误报告(在测试阶段这从来都不是一个好主意),或者c) 你在错误信息那里找错了地方,可能。
假设你想把对 weekstart 的静态引用替换为 CASE 表达式的输出,那么只需从查询中移除原来的 weekstart 引用:
INSERT INTO myrota (weekstart)
SELECT
CASE
WHEN weekstart= '2026-03-02' THEN '2026-03-16'
WHEN weekstart= '2026-03-09' THEN '2026-03-23'
ELSE 'empty'
END AS weekstart
FROM myrota
现在你又只输出一个列,与 INSERT 子句中的列列表相匹配。
如果你的PHP端能正确地报错,和/或你在SQL直接测试查询以确保基本结构正确,那么理解、研究和解决这个问题就会容易得多。请务必查看 如何在PHP中获取有用的错误信息? 以确保你的PHP设置正确。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。