在同一条SQL语句中对重复的行应用CASE表达式

后端开发 2026-07-12

我在做每周排班表。已经使用这段代码把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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章