You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复制排班表SQL行时,使用CASE条件修改weekstart字段的语句失效求助

复制排班表SQL行时,使用CASE条件修改weekstart字段的语句失效求助

看起来你的SQL语句有两个关键问题导致它失效,咱们一步步来梳理和修正:

问题1:字段数量不匹配

你在INSERT语句里只指定了要插入weekstart这一个字段,但SELECT后面却返回了两个值:原来的weekstart和CASE语句生成的新weekstart,数据库遇到这种字段数量不匹配的情况肯定会报错。

正确的思路是:SELECT里只保留CASE生成的新weekstart值,同时把你需要复制的其他字段(比如shift、employid、name这些,和你最初能正常运行的代码保持一致)也加进来,让INSERT的字段列表和SELECT返回的字段数量完全对应。

问题2:缺少过滤条件,会复制全表数据

你原来的代码是只复制特定weekstart的行,但修改后的SQL去掉了WHERE子句,这会把整个myrota表的所有行都复制一遍——这显然不是你想要的,你应该只复制weekstart等于$dateone或$datetwo的目标行。


修正后的代码

$dateone = "2026-03-02";
$datetwo = "2026-03-09";

$datethree = "2026-03-16";
$datefour = "2026-03-23";

// 修正后的SQL语句
$sql = "INSERT INTO myrota (weekstart, shift, employid, name, mon, tue)
SELECT 
  CASE
     WHEN weekstart = '$dateone' THEN '$datethree'
     WHEN weekstart = '$datetwo' THEN '$datefour'
     ELSE weekstart  -- 由于WHERE已经筛选了目标行,这个ELSE其实可以不用,保险起见保留
  END,
  shift, employid, name, mon, tue
FROM myrota 
WHERE weekstart IN ('$dateone', '$datetwo')";  -- 只筛选需要复制的行

额外提醒:避免SQL注入风险

直接把变量拼进SQL语句存在严重的SQL注入风险,建议你使用PHP的预处理语句来绑定变量,下面是PDO的示例:

// 假设你已经建立了PDO连接$pdo
$stmt = $pdo->prepare("INSERT INTO myrota (weekstart, shift, employid, name, mon, tue)
SELECT 
  CASE
     WHEN weekstart = ? THEN ?
     WHEN weekstart = ? THEN ?
     ELSE weekstart
  END,
  shift, employid, name, mon, tue
FROM myrota 
WHERE weekstart IN (?, ?)");

// 按顺序绑定变量并执行
$stmt->execute([$dateone, $datethree, $datetwo, $datefour, $dateone, $datetwo]);

备注:内容来源于stack exchange,提问作者kumbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:18:04