MYSQL 服务器 - 如果不是空,则仅更新值



我只想在值不是空或空字符串时才更新它,但我已经尝试了从COALESCE(new_value, old_value)COALESCE(NullIf(RTrim(new_value),'')old_value)的所有方法。

我完全迷失了想法,我一直在浏览互联网寻找解决方案,但我找不到任何适合我的东西。

$query = "UPDATE Person SET fornavn=COALESCE($escapedFornavn,fornavn), efternavn='$escapedEfternavn', alder='$escapedAlder', email='$escapedEmail', adresse='$escapedAdresse', telefon=$escapedTelefon WHERE brugernavn='$brugernavn'; ";

我希望上面的查询仅在用户在表单中键入值时才更新每个值,如果表单为空,则应仅使用旧值。

如果你按照假设使用mysqlCOALESCE函数,你可以这样做。还需要nullif,但您用错了。

当你用php生成这段代码时,你必须考虑如何处理字符串值与null值相比(字符串值需要引号,NULL 不需要(:

$query = "UPDATE Person SET fornavn=COALESCE('$escapedFornavn',fornavn)"

将按预期工作,如果$esapedFornavn是有效的字符串。但是,如果$esapedFornavn==null查询将看起来像第一个查询,而您需要第二个查询...

UPDATE Person SET fornavn=COALESCE('',fornavn);
UPDATE Person SET fornavn=COALESCE(null,fornavn);

因此,要实现所需的内容,您可以使用nullif将空字符串转换为实际nulls

UPDATE Person SET fornavn=COALESCE(nullif('$escapedFornavn', ''),fornavn)

基本测试:

SELECT COALESCE(nullif(null,''),"oldvalue") -- will return "oldvalue", so no update.
SELECT COALESCE(nullif("newvalue",''),"oldvalue") -- will return "newvalue", so the change is persisted.

唯一的缺点:你不能将某些内容设置为空字符串,因为这将保留旧值:

SELECT COALESCE( NULLIF('',  ''), "oldvalue") --returns oldvalue

解决方法是改为存储单个空格,并在要显示它时使用trim()

如注释中的建议,在应用程序中处理它。我希望这个查询会以某种方式有用。

UPDATE Person SET fornavn=IF(fornavn is NULL,NULL,new_value);

应考虑使用UPDATE SELECT 将数据放入查询中,然后使用

SET target.column = IF(source.column is invalid, target.column, source.column)

当您将列设置为自身时,您不会更改它。

下面是一个可能的示例。

UPDATE p
SET p.col1 = IF(q.col1 IS NULL OR LENGTH(q.col1) = 0, p.col1, q.col1),
p.col1 = IF(q.col2 IS NULL OR LENGTH(q.col2) = 0, p.col2, q.col2),
p.col1 = IF(q.col3 IS NULL OR LENGTH(q.col3) = 0, p.col3, q.col3),
...
FROM Person AS p
JOIN (
SELECT 
<<<value1>> col1,
<<<value2>> col2,
<<<value3>> col3,
...
) AS q
WHERE <<<whatever condition>>>

最新更新