简体   繁体   English

满足条件时的Sql-Exit CASE语句

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

The following CASE statement updates BET1 , BET2 , BET3 and BET4 at the same time when ID=10 . 以下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";

When I run the php page, I have BET1=32 , BET2=32 , BET3=32 , BET4=32 . 当我运行php页面时,我有BET1=32BET2=32BET3=32BET4=32

What I want is to have the script exit when it finds and fills the first null field. 我想要的是让脚本在找到并填充第一个null字段时退出。

Ie, starting with all BET1 , BET2 , BET3 , BET4 = NULL when ID =10 , I want when I run the php page, to update only BET1=32 . 即, BET4 = NULL when ID =10 ,从所有BET1BET2BET3BET4 = NULL when ID =10 ,我想在运行php页面时,仅更新BET1=32 And when I run it again, to update BET2=32 , etc. 当我再次运行时,更新BET2=32等。

Something similar to the following: 类似于以下内容:

    $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";

RESULTS 结果

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.

How can I edit the script to perform the above function? 如何编辑脚本以执行上述功能?

EDIT 编辑

@ InoS Heo @ InoS Heo

One final question if you have the time. 如果你有时间,最后一个问题。

I have $S1=32 before running the sql. 在运行sql之前我有$ S1 = 32。 Suppose instead of 32 I have susan, which is of course a string. 假设不是32我有苏珊,这当然是一个字符串。

How can your script be updated to accommodate strings like above? 如何更新脚本以适应上述字符串?

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

Thanks. 谢谢。

You are looking for "UPDATE first NULL column" . 您正在寻找"UPDATE first NULL column" I think this can be achieved using MySQL User Variable. 我认为这可以使用MySQL用户变量来实现。

Could you try this? 你能试试吗?

Schema & data 架构和数据

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);

Initial Data 初始数据

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

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;

updated data 更新的数据

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

Problem 问题

Still has a problem when you want to UPDATE 10. 当你想要更新10时仍然有问题。

UPDATED 更新

1. USING some string_column 1.使用一些string_column

I think you have two choices 我认为你有两个选择

  1. using string column rather than ID column 使用字符串列而不是ID列
    • pros : can be achieved using one UPDATE 优点:可以使用一个UPDATE实现
    • cons : can't be used if there are no more string column 缺点:如果没有更多的字符串列,则无法使用
  2. execute UPDATE for each rows 对每行执行UPDATE
    • pros : can be used even if there are no more string column 优点:即使没有更多的字符串列也可以使用
    • cons : executes several UPDATE, Can't be used if there are no PK. 缺点:执行几个UPDATE,如果没有PK则不能使用。

I wonder if you have some string column like string_col as follows. 我想知道你是否有像string_col这样的字符串列,如下所示。

Schema & Data 架构和数据

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

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;

RESULT 结果

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. execute one UPDATE for each record 2.为每条记录执行一次UPDATE

With following pseudo code, you could achieve it. 使用以下伪代码,您可以实现它。

$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
    ");

}

preceding code can be implemented client side or Stored procedure. 前面的代码可以实现客户端或存储过程。

You can simply check that the other fields are already not null s: 您可以简单地检查其他字段是否已经为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