SQL if not null update

前端 未结 5 1698
忘掉有多难
忘掉有多难 2021-01-26 03:18

I have this query

UPDATE users SET username = Param1,email = Param2,PASSWORD = Param3 WHERE id = Param4;

this is updating my user row, but

相关标签:
5条回答
  • 2021-01-26 03:36

    Maybe this will work:

    UPDATE users 
       SET username = Param1, email = Param2, PASSWORD = Param3 
     WHERE id = Param4
       AND CONCAT(email,password) IS NOT NULL;
    

    I've tried with MySQL version 4, 5.x and 8 with MariaDB 10, whenever you do CONCAT on columns where one of the column value is NULL, you'll always get NULL result.

    Edit: For empty string, something like this.

    UPDATE users 
       SET username = Param1, email = Param2, PASSWORD = Param3 
     WHERE id = Param4
       AND CONCAT(email,password) <> '';
    

    For both NULL and empty string, something like this.

    UPDATE users 
       SET username = Param1, email = Param2, PASSWORD = Param3 
     WHERE id = Param4
       AND CONCAT(email,password) IS NOT NULL OR CONCAT(email,password) <> '';
    
    0 讨论(0)
  • 2021-01-26 03:37

    Please check if this works..

     DECLARE @email varchar(100), @password varchar(50)
        SET @email = null  
        SET @password = null
    
        IF @email <= (SELECT email from users WHERE id = Param4)   
        UPDATE users SET username = Param1,email = Param2,PASSWORD = Param3 WHERE id = Param4;
    
        IF @password <= (SELECT PASSWORD from users WHERE id = Param4)   
        UPDATE users SET username = Param1,email = Param2,PASSWORD = Param3 WHERE id = Param4;
    
    0 讨论(0)
  • 2021-01-26 03:39

    Like this

    UPDATE users 
    SET 
      username = Param1,
      email = COALESCE(Param2, email),
      password = COALESCE(Param3, password)
    WHERE id = Param4;
    

    COALESCE works from left to right taking the first non null argument. If you provide null as Param2, it will update email to email (no change). If you provide a value to Param2, coalesce will return that non null value so email is updated to whatever param2 is

    Ps: understood your request to be "I will provide either a null or a value in the parameter. If I provide a null I don't want to update the db table. If I provide a value I do want to update the DB table"

    This seemed more logical to me than how your question reads which is "if my table value is null for email then I forever want it to remain null and never want any of the values I supply in the parameters to be written to the table"

    0 讨论(0)
  • 2021-01-26 03:45
    UPDATE users 
    SET username = Param1,
    email = Param2,
    PASSWORD = Param3 
    WHERE id = Param4 AND (ISNULL(email,'') != '' OR ISNULL(PASSWORD, '') != '');
    
    0 讨论(0)
  • 2021-01-26 03:49

    If email OR password is not null update them otherwise let them be as they are.

    You can use case expressions for this. I think that the logic you want is:

    UPDATE users 
    SET 
        username = Param1
        email = case when email is not null then Param2 end,
        password = case when password is not null then Param3 end
    WHERE id = Param4;
    

    Or if you want to update email and password if both are not null then:

    UPDATE users 
    SET 
        username = Param1
        email = case when email is not null and password is not null then Param2 end,
        password = case when email is not null and password is not null then Param3 end
    WHERE id = Param4;
    

    Now the question was updated and I understand that you want to perform the update if and only if both email and password parameters are not empty strings. So you actually want filtering. I would phrase this as:

    UPDATE users 
    SET username = Param1, email = Param2, password = Param3 
    WHERE id = Param4 and Param2 <> '' and Param3 <> ''
    

    Or if you want to separate the logic for both parameters:

    UPDATE users 
    SET 
        username = Param1, 
        email = case when Param2 <> '' then Param2 else email end, 
        password = case when Param3 <> '' then Param3 else password end
    WHERE id = Param4;
    
    0 讨论(0)
提交回复
热议问题