我只想更新一个不为null或为空字符串的值,但是我尝试了从int
到float
的所有内容。
我对想法完全迷失了,我一直在浏览互联网以寻求解决方案,但是找不到适合我的东西。
COALESCE(new_value, old_value)
我希望上面的查询仅在用户在表单中键入值时更新每个值,如果表单为空,则应仅使用旧值。
答案 0 :(得分:1)
如果按假定使用mysql COALESCE
函数,则可以执行此操作。另外,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()
:
答案 1 :(得分:0)
根据评论中的建议,在应用程序中进行处理。我希望这个查询会以某种方式有用。
UPDATE Person SET fornavn=IF(fornavn is NULL,NULL,new_value);
答案 2 :(得分:0)
您应该考虑使用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>>>