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:
$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:
$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.if (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 
IFis a statement, not an expression. The equivalent for expressions isCASE, something like:UPDATE 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 
WHEREclause:UPDATE users SET fname = :fname WHERE username = :username and trim(:fname) <> ''