I am trying to do a postgres update using if conditions to check if a parameter is empty before attempting to update.
The desired result would be not to update when the parameter is an ampty string.
I cannot seem to figure out the correct way to do this. My first attempt is below:
JavaScript
x
$stmt = $db->prepare("
UPDATE users SET
fname = IF(trim(:fname) = '', fname, :fname)
WHERE username = :username");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':fname', $fname);
$stmt->execute();
and then my second attempt was using:
JavaScript
$stmt = $db->prepare("
UPDATE users SET fname =
IF
trim(:fname) = ''
THEN
fname
ELSE
:fname
END IF;
WHERE username = :username
");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':fname', $fname);
$stmt->execute();
What is the correct way of doing this with IF statements?
Advertisement
Answer
- Probably the best way would be not to execute the statement; the PHP code already knows that the parameter is empty, so it can refrain from calling the
$stmt->execute()
(and surrounding code). That will also save the round-trip time to the database.JavaScriptif (trim($fname) != "") {
$stmt = $db->prepare("
UPDATE users
SET fname = :fname
WHERE username = :username");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':fname', $fname);
$stmt->execute();
}
- If you do need to have the condition in the PostgreSQL query, note that
IF
is a statement, not an expression. The equivalent for expressions isCASE
, something like:JavaScriptUPDATE users
SET fname = CASE WHEN trim(:fname) = '' THEN fname ELSE :fname END
WHERE username = :username
- In this particular case, you can also put the condition as part of the
WHERE
clause:JavaScriptUPDATE users
SET fname = :fname
WHERE username = :username and trim(:fname) <> ''