我只想在值不是空或空字符串时才更新它,但我已经尝试了从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>>>