以下CASE 语句更新BET1、BET2、BET3 和BET4同时 ID=10。
$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 字段时退出。
即,以所有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.
如何编辑脚本来执行上述功能?
编辑
@伊诺斯赫奥
最后一个问题,如果你有时间的话。
在运行 sql 之前我有 $S1=32。假设我有 susan 而不是 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 `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 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
");
}
前面的代码可以在客户端或存储过程中实现。
关于php - Sql-满足条件时退出CASE语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20608403/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl
我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS
除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案