【发布时间】:2022-01-20 18:28:01
【问题描述】:
我有这个与表单连接的 PHP 代码(使用 nette 框架),每个表中的列名都不同,但每个人都有 geo 列:
$this->masterRepository->query("
INSERT INTO ".$table." (".$cols.")
SELECT ".$cols."
CASE
WHEN `geo` = '".$values['old_text']."' THEN `geo` = '".$values['new_text']."'
ELSE `geo` = '".$values['new_text']."'
END
FROM ".$table." WHERE `geo` = '".$values['old_text']."';
");
生成此 SQL:
INSERT INTO some_table (num_order, geo, url, note)
SELECT num_order, geo, url, note
CASE
WHEN `geo` = 'US' THEN `geo` = 'CA'
ELSE `geo` = 'CA'
END
FROM some_table
WHERE `geo` = 'US';
但我收到此错误:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE
WHEN `geo` = 'US' THEN `geo` = 'CA'
目标是将数据复制到同一张表中,但在插入之前更改 geo 列的值。 我知道 ELSE 值看起来很愚蠢,但 CASE 总是会因为 WHERE 选择而结束。
我该如何解决这个错误,或者我应该使用不同的方法?谢谢。
【问题讨论】:
-
CASE前面少了一个逗号。 -
您正在插入 4 个列名,但
SELECT返回 5 个列。CASE表达式的结果应该放在哪一列? -
CASE表达式的意义何在?在这两种情况下,您都返回相同的东西。 -
另外一件事:既然你有
WHERE geo = 'US',WHEN geo = 'US'的大小写就会一直匹配。