如何仅更新非空值?
我有一个用于更新结果集的SQL代码。
但是在我提交表单后,我没有输入的值也会被更新并在数据库中记录为空值。
这是我的代码
$insert = "UPDATE result SET test_1= '$test_1', test_2= '$test_2',
test_3= '$test_3', test_4= '$test_4',
test_5 = '$test_5'
WHERE roll_no = '$roll_no'";
表格
<form action="#" method="post">
<input type="text" name="test_1" required="" class="" >
<input type="text" name="test_2" required="" class="" >
<input type="text" name="test_3" required="" class="" >
<input type="text" name="test_4" required="" class="" >
<input type="text" name="test_5" required="" class="" >
<button type="submit" class="" name="sub">SUBMIT</button>
如果我只填写 test_1 和 test_2 ,我希望其他列不受影响,因为没有输入。
答案 0 :(得分:0)
如果您想坚持自己发布的查询,那么COALESCE
可以在这种情况下为您提供帮助。
UPDATE result
SET test_1 = COALESCE('$test_1', test_1), test_2 = COALESCE('$test_2', test_2),
test_3 = COALESCE('$test_3', test_3), test_4 = COALESCE( '$test_4', test_4),
test_5 = COALESCE('$test_5', test_5)
WHERE roll_no = '$roll_no';
MySQL COALESCE()
函数返回列表的第一个非NULL值,如果没有非NULL值,则返回NULL。
示例: MySQL COALESCE()
函数
mysql> SELECT COALESCE(NULL, 2, 3);
+----------------------+
| COALESCE(NULL, 2, 3) |
+----------------------+
| 2 |
+----------------------+
1 row in set (0.02 sec)
mysql> SELECT COALESCE(NULL, NULL, NULL);
+----------------------------+
| COALESCE(NULL, NULL, NULL) |
+----------------------------+
| NULL |
+----------------------------+
1 row in set (0.00 sec)
注意:只有空值实际为NULL
时才会有效。 NULL <> Empty
答案 1 :(得分:0)
首先,您需要一种方法来确定是否存在&#34;没有输入&#34;对于给定的表单字段。我们假设将提供表单字段,并且该值将为零长度字符串。
也就是说,我们可以对分配给变量的值(例如$ test_4`)进行条件测试,以确定这是否是我们要存储的值,或者它是否&#34;没有输入& #34;,我们要忽略它。
在SQL中,可以评估表达式并返回值。例如,ANSI标准:
CASE WHEN foo = '' THEN bar ELSE foo END
或特定于MySQL的简写:
IF(foo = '',bar,foo)
在UPDATE语句中,可以引用列的当前值,我们可以在表达式中返回...
UPDATE mytable t
SET t.col = IF(foo='',t.col,foo)
WHERE ...
如果foo
等于零长度字符串,则表达式返回列的当前值。这将被分配回同一列,导致&#34;没有更新&#34;列值。 (请注意,如果在表上定义了更新&#34;触发器之前的触发器,触发器将被触发,这可能会修改NEW.col
的值。)
假设已正确转义值$test_4
以缓解潜在的SQL注入漏洞,并且由于某些原因我们无法使用带有绑定占位符的预准备语句...
假设我们要让$test_4
中存储的零长度字符串代表&#34;没有输入&#34;
我们可以这样做:
UPDATE result r
SET ...
, r.test_4 = IF('$test_4' = '', r.test_4, '$test_4')
WHERE ...
表达
的ANSI标准方式越多UPDATE result r
SET ...
, r.test_4 = CASE WHEN '$test_4' = '' THEN r.test_4 ELSE '$test_4' END
WHERE ...
答案 2 :(得分:-1)
尝试ifnull函数,如下所示:
UPDATE result
SET test_1 = ifnull(test_1,'$test_1'),
test_2 = ifnull(test_2,'$test_2'),
test_3 = ifnull(test_3,'$test_3'),
test_4 = ifnull(test_4,'$test_4'),
test_5 = ifnull(test_5,'$test_5')
WHERE roll_no = '$roll_no'