Skip to content
Advertisement

PHP, SQL – INSERT INTO SELECET CASE

I have this PHP code connected with form (using nette framework), name of columns are different in every table but geo column is in everyone:

                $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']."';

                ");

which generate this 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';

but I’m getting this error:

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'

The goal is to COPY data into the same table but change value of geo column before insert. I know that ELSE value looks stupid but CASE will always end up same because the WHERE selection.

How can I fix this error or should I use different approach? Thanks.

Advertisement

Answer

The syntax error is because you’re missing a comma before CASE. But there are other problems with the query after fixing that.

You don’t need the CASE expression at all, since the WHERE clause is only selecting those rows. What you want is:

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

To do this with your variables, you’ll need to remove geo from $cols so that SELECT ".$cols will not include it and you can add $values["new_text"] at the end of the SELECT list.

$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']."';

");
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement