2017-04-05 48 views
-1

如何只更新非空值?如何僅更新表中的非空值?

我有一個用於更新結果集的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_1test_2填補,我想其他列不受影響,因爲沒有投入。

+0

什麼不爲空,則列或變量?如果變量動態構建查詢。 – chris85

+0

在您的代碼中檢查它們是否未輸入,如果不是,請將該變量設置爲=,並將其放入更新查詢中。如果名稱爲空或未輸入,請指定name =「not supplied」。 – clearshot66

+0

某些變量將爲空,但列中將包含一個值。當我提交時,只需要填寫更新的輸入(例如:test_1和test_2),整個列就會更新。 –

回答

0

首先,你需要一種方法來確定,有「無輸入」對於給定的表單字段。我們假設將提供表單字段,並且該值將是一個零長度的字符串。也就是說,我們可以對分配給變量(例如$ test_4`)的值進行條件測試,以確定這是我們要存儲的值還是我們想要的「沒有輸入」漠視。


在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如果是等於一個零長度字符串,則表達式返回列的當前值。這將被分配回同一列,導致列值「不更新」。(請注意,如果有上表中定義的「前更新」的觸發,觸發將解僱,並可能修改NEW.col值)。


假設值$test_4已正確逃到減輕潛在的SQL注入漏洞,有一些原因,我們不能使用綁定的佔位符準備好的語句...

假設我們將讓存儲在$test_4零長度字符串表示「沒有輸入」

我們可以做這樣的事情:

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 ... 
+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。

例子: 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

我認爲這是解決方案,但參數顛倒。對於我所瞭解的'$ test_1'是頁面中的變量,這就是'NULL' ......所以'COALESCE('$ test_1',test_1)'將賦值變量'$ test_1'只有當不'NULL'否則保留以前的值。 –

+0

非常感謝@JuanCarlosOropeza。您的意見是高度讚賞。 – 1000111

-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'