[英]Sql-Exit CASE Statement when condition is met
以下CASE
語句在ID=10
的同時更新BET1
, BET2
, BET3
和BET4
。
$S1=32
$sql="UPDATE TIMER-BOARD1
set BET1= case when BET1 IS NULL THEN $S1 else BET1 end ,
BET2= case when BET2 IS NULL THEN $S1 else BET2 end,
BET3= case when BET3 IS NULL THEN $S1 else BET3 end,
BET4= case when BET4 IS NULL THEN $S1 else BET4 end
WHERE ID = 10";
當我運行php頁面時,我有BET1=32
, BET2=32
, BET3=32
, BET4=32
。
我想要的是讓腳本在找到並填充第一個null
字段時退出。
即, BET4 = NULL when ID =10
,從所有BET1
, BET2
, BET3
, BET4 = NULL when ID =10
,我想在運行php頁面時,僅更新BET1=32
。 當我再次運行時,更新BET2=32
等。
類似於以下內容:
$S1=32
$sql="UPDATE TIMER-BOARD1
set BET1= case when BET1 IS NULL THEN $S1
( EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET1 end ,
BET2= case when BET2 IS NULL THEN $S1
(EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET2 end,
BET3= case when BET3 IS NULL THEN $S1
(EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET3 end,
BET4= case when BET4 IS NULL THEN $S1
(EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET4 end
WHERE ID = 10";
結果
Start values: ID=10 ,BET1=NULL, BET2=NULL, BET3=NULL, BET4=NULL.
Run the script 1ST time: ID=10, BET1=32, BET2 =NULL, BET3=NULL, BET4=NULL.
Run the script 2nd time: ID=10, BET1=32, BET2= 32, BET3=NULL, BET4 = NULL.
Run the script 3rd time: ID=10, BET1=32, BET2=32, BET3=32, BET4=NULL.
Run the script 4th time: ID=10, BET1=32, BET2=32, BET3=32, BET4=32.
Run the script 5th time or more: No null field, so no change.
如何編輯腳本以執行上述功能?
編輯
@ InoS Heo
如果你有時間,最后一個問題。
在運行sql之前我有$ S1 = 32。 假設不是32我有蘇珊,這當然是一個字符串。
如何更新腳本以適應上述字符串?
$S1 =susan
UPDATE `TIMER-BOARD1`
set
ID = @UPDATED := 10,
BET1 = case when BET1 IS NULL THEN @UPDATED:= susan else BET1 end,
BET2 = case when @UPDATED = 10 AND BET2 IS NULL THEN @UPDATED:= susan else BET2 end,
…
BET4 = case when @UPDATED = 10 AND BET4 IS NULL THEN @UPDATED:= susan else BET4 end
WHERE ID = 10;
謝謝。
您正在尋找"UPDATE first NULL column"
。 我認為這可以使用MySQL用戶變量來實現。
你能試試嗎?
架構和數據
DROP TABLE IF EXISTS `TIMER-BOARD1`;
CREATE TABLE `TIMER-BOARD1` (
`ID` int(11) NOT NULL,
`BET1` int(11) DEFAULT NULL,
`BET2` int(11) DEFAULT NULL,
`BET3` int(11) DEFAULT NULL,
`BET4` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELETE FROM `TIMER-BOARD1`;
INSERT INTO `TIMER-BOARD1` VALUES (10, NULL, NULL, NULL, NULL),
(10, 32, NULL, NULL, NULL), (10, 1, 2, NULL, NULL),
(10, 1, 2, 3, NULL), (10, 1, 2, 3, 4);
初始數據
SELECT * FROM `TIMER-BOARD1`;
+----+------+------+------+------+
| ID | BET1 | BET2 | BET3 | BET4 |
+----+------+------+------+------+
| 10 | NULL | NULL | NULL | NULL |
| 10 | 32 | NULL | NULL | NULL |
| 10 | 1 | 2 | NULL | NULL |
| 10 | 1 | 2 | 3 | NULL |
| 10 | 1 | 2 | 3 | 4 |
+----+------+------+------+------+
UPDATE
UPDATE `TIMER-BOARD1`
set
ID = @UPDATED := 10, -- user defined variable which keep track WHETHERE CHANGED OR NOT
BET1 = case when BET1 IS NULL THEN @UPDATED:= 32 else BET1 end,
BET2 = case when @UPDATED = 10 AND BET2 IS NULL THEN @UPDATED:=32 else BET2 end,
BET3 = case when @UPDATED = 10 AND BET3 IS NULL THEN @UPDATED:=32 else BET3 end,
BET4 = case when @UPDATED = 10 AND BET4 IS NULL THEN @UPDATED:=32 else BET4 end
WHERE ID = 10;
更新的數據
SELECT * FROM `TIMER-BOARD1`;
mysql> SELECT * FROM `TIMER-BOARD1`;
+----+------+------+------+------+
| ID | BET1 | BET2 | BET3 | BET4 |
+----+------+------+------+------+
| 10 | 32 | NULL | NULL | NULL |
| 10 | 32 | 32 | NULL | NULL |
| 10 | 1 | 2 | 32 | NULL |
| 10 | 1 | 2 | 3 | 32 |
| 10 | 1 | 2 | 3 | 4 |
+----+------+------+------+------+
問題
當你想要更新10時仍然有問題。
我認為你有兩個選擇
我想知道你是否有像string_col
這樣的字符串列,如下所示。
架構和數據
DROP TABLE IF EXISTS tab;
CREATE TABLE tab (
`ID` int(11) NOT NULL,
`BET1` VARCHAR(100) DEFAULT NULL,
`BET2` VARCHAR(100) DEFAULT NULL,
`BET3` VARCHAR(100) DEFAULT NULL,
`BET4` VARCHAR(100) DEFAULT NULL,
`string_col` VARCHAR(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELETE FROM tab;
INSERT INTO tab VALUES
(10, NULL, NULL, NULL, NULL, 'A'),
(10, 'Alice', NULL, NULL, NULL, 'B'),
(10, 'Alice', 'Bob', NULL, NULL, 'C'),
(10, 'Alice', 'Bob', 'Charlie', NULL, 'D'),
(10, 'Alice', 'Bob', 'Charlie', 'Dave', 'E');
SELECT * FROM tab;
+----+-------+------+---------+------+------------+
| ID | BET1 | BET2 | BET3 | BET4 | string_col |
+----+-------+------+---------+------+------------+
| 10 | NULL | NULL | NULL | NULL | A |
| 10 | Alice | NULL | NULL | NULL | B |
| 10 | Alice | Bob | NULL | NULL | C |
| 10 | Alice | Bob | Charlie | NULL | D |
| 10 | Alice | Bob | Charlie | Dave | E |
+----+-------+------+---------+------+------------+
UPDATE
UPDATE tab
set
string_col = @ORIG_STRING_COL := (@UPDATED := string_col),
BET1 = IF(BET1 IS NULL, @UPDATED := 'Susan', BET1),
BET2 = IF(@UPDATED != 'Susan' AND BET2 IS NULL, @UPDATED := 'Susan', BET2),
BET3 = IF(@UPDATED != 'Susan' AND BET3 IS NULL, @UPDATED := 'Susan', BET3),
BET4 = IF(@UPDATED != 'Susan' AND BET4 IS NULL, @UPDATED := 'Susan', BET4),
string_col = @ORIG_STRING_COL
WHERE ID = 10;
結果
SELECT * FROM tab;
+----+-------+-------+---------+-------+------------+
| ID | BET1 | BET2 | BET3 | BET4 | string_col |
+----+-------+-------+---------+-------+------------+
| 10 | Susan | NULL | NULL | NULL | A |
| 10 | Alice | Susan | NULL | NULL | B |
| 10 | Alice | Bob | Susan | NULL | C |
| 10 | Alice | Bob | Charlie | Susan | D |
| 10 | Alice | Bob | Charlie | Dave | E |
+----+-------+-------+---------+-------+------------+
使用以下偽代碼,您可以實現它。
$res = mysqli_query(SELECT pk_column FROM tab WHERE ID = 10);
while ($row = mysqli_fetch_assoc($res))
{
$pk_col = $row['pk_column'];
mysqli_query("SET @UPDATED := ''");
mysqli_query("UPDATE tab
SET
BET1 = IF(BET1 IS NULL, @UPDATED := 'Susan', BET1),
BET2 = IF(@UPDATED = '' AND BET2 IS NULL, @UPDATED := 'Susan', BET2),
BET3 = IF(@UPDATED = '' AND BET3 IS NULL, @UPDATED := 'Susan', BET3),
BET4 = IF(@UPDATED = '' AND BET4 IS NULL, @UPDATED := 'Susan', BET4)
WHERE pk_col = $pk_column
");
}
前面的代碼可以實現客戶端或存儲過程。
您可以簡單地檢查其他字段是否已經為null
:
UPDATE TIMER-BOARD1
SET BET1= case when BET1 IS NULL THEN $S1 else BET1 end ,
BET2= case when BET1 IS NOT NULL AND BET2 IS NULL THEN $S1 else BET2 end,
BET3= case when BET1 IS NOT NULL AND BET2 IS NOT NULL AND BET3 IS NULL THEN $S1 else BET3 end,
BET4= case when BET1 IS NOT NULL AND BET2 IS NOT NULL AND BET3 IS NOT NULL AND BET4 IS NULL THEN $S1 else BET4 end
WHERE ID = 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.