2009-12-07 16 views
10

Tengo una declaración de actualización que actualiza los campos x, y y z donde id = xx.Campo de actualización cuando no es nulo

En la tabla tengo algunos campos x_created_datetime diferentes (para diferentes partes del registro que son mantenidas/ingresadas por diferentes personas). Me gustaría escribir una sola consulta que actualice este campo si es nulo, pero déjelo en blanco si no es nulo.

Así que lo que tengo es:

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp" 
WHERE id = X 

Lo que necesito es una manera de añadir en la siguiente, pero aún así siempre actualizar la anterior:

scan_created_date = "current_unix_timestamp" 
where scan_created_date is null 

que espero que pueda hacer esto sin una segunda transacción a la base de datos. ¿Alguna idea sobre cómo lograr esto?

Respuesta

28

hacer esto:

UPDATE newspapers 
SET scan_notes = "data",  
    scan_entered_by = "some_name",  
    scan_modified_date = "current_unix_timestamp", 
    scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp") 
WHERE id = X 

La función COALESCE recoge el primer valor no nulo. En este caso, actualizará datestamp scan_created_date para que tenga el mismo valor si existe, de lo contrario tomará lo que reemplace "current_unix_timestamp" con.

+3

Vale la pena una breve explicación de por qué esto funciona: se unen devuelve el primer valor no nulo en su lista de valores, por lo que si el scan_created_date ya está ahí , se establecerá al valor que ya está allí. Si es nulo, se establecerá a la marca de tiempo actual. –

+0

¿No actualizará esto el scan_created_date cuando sea nulo? Parece que quiere actualizarlo donde no es nulo. – tloach

+0

@tloach - vea la explicación. @JacobM - ya lo estaba haciendo :) – cjk

1

Se puede usar COALESCE() wich devuelve el primer valor no nulo):

scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp") 
4

Creo que lo que estás buscando es IF()

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp", 
    scan_created_date = IF(scan_created_date IS NOT NULL, "current_unix_timestamp", NULL) 
WHERE id = X 
3

MySQL tiene una función IFNULL , entonces usted podría hacer:

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp" 
    scan_created_date = IFNULL(scan_created_date, "current_unix_timestamp") 
WHERE id = X 
1

Puede hacer algo como esto:

UPDATE newspapers a, newspapers b 
SET a.scan_notes = "data",  
    a.scan_entered_by = "some_name",  
    a.scan_modified_date = "current_unix_timestamp", 
    b.scan_created_date = "current_unix_timestamp" 
WHERE a.id = X AND b.id = X AND b.scan_created_date is not NULL 
0

Es equivalente al NVL de Oracle. Se puede utilizar, como a continuación en una declaración preparada usando parámetros

UPDATE 
    tbl_cccustomerinfo 
SET 
    customerAddress = COALESCE(?,customerAddress), 
    customerName = COALESCE(?,customerName), 
    description = COALESCE(?,description) 
WHERE 
    contactNumber=? 
Cuestiones relacionadas