簡體   English   中英

滿足條件時的Sql-Exit CASE語句

[英]Sql-Exit CASE Statement when condition is met

以下CASE語句在ID=10的同時更新BET1BET2BET3BET4

$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=32BET2=32BET3=32BET4=32

我想要的是讓腳本在找到並填充第一個null字段時退出。

即, BET4 = NULL when ID =10 ,從所有BET1BET2BET3BET4 = 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時仍然有問題。

更新

1.使用一些string_column

我認為你有兩個選擇

  1. 使用字符串列而不是ID列
    • 優點:可以使用一個UPDATE實現
    • 缺點:如果沒有更多的字符串列,則無法使用
  2. 對每行執行UPDATE
    • 優點:即使沒有更多的字符串列也可以使用
    • 缺點:執行幾個UPDATE,如果沒有PK則不能使用。

我想知道你是否有像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          |
+----+-------+-------+---------+-------+------------+

2.為每條記錄執行一次UPDATE

使用以下偽代碼,您可以實現它。

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM