【问题标题】:PHP, SQL - INSERT INTO SELECET CASEPHP,SQL - 插入选择案例
【发布时间】: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' 的大小写就会一直匹配。

标签: php sql


【解决方案1】:

语法错误是因为您在CASE 之前缺少一个逗号。但修复后查询还有其他问题。

您根本不需要CASE 表达式,因为WHERE 子句只选择那些行。你想要的是:

INSERT INTO some_table (num_order, url, note, geo)
SELECT num_order, url, note, 'CA'
FROM some_table 
WHERE `geo` = 'US';

要对您的变量执行此操作,您需要从$cols 中删除geo,这样SELECT ".$cols 就不会包含它,您可以在SELECT 列表的末尾添加$values["new_text"]

$cols1 = str_replace('geo,', '', $cols);
$this->masterRepository->query("

    INSERT INTO ".$table." (".$cols1.", geo)
    SELECT ".$cols1.", '".$values['new_text']."'
    FROM ".$table." 
    WHERE `geo` = '".$values['old_text']."';

");

【讨论】:

  • 非常感谢,仅在 SELECT 部分中更正值 ['new_text'] 之前的 $ 符号
【解决方案2】:

您的别名错误 note 应该在 case 之后 并且没有使用where,因为您正在使用CASE 处理地理值

INSERT INTO some_table (num_order, geo, url, note)
SELECT num_order, geo, url, 
CASE
WHEN `geo` = 'US' THEN `geo` = 'CA'
ELSE `geo` = 'CA'
END as note 
FROM some_table 

【讨论】:

  • 我感觉他真正想做的是将CASE用作geo的新值。他正在将所有美国条目复制到 CA 条目。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2023-04-11
  • 2014-12-12
相关资源
最近更新 更多