我正在尝试在PHP中创建一个SQL查询来更新表.是否可以WHERE为每个受影响的行设置不同的子句?
例如:
UPDATE table
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2
Run Code Online (Sandbox Code Playgroud)
等等?
任何帮助赞赏.谢谢
Dav*_*res 14
是的,您可以使用CASE声明.
UPDATE table
SET val = CASE someproperty
WHEN 1 THEN x
WHEN 2 THEN y
....
ELSE
val
END
Run Code Online (Sandbox Code Playgroud)
现在,有人担心,CASE与几个UPDATE语句相比,一个语句的可读性较差.这里有一个有效的论点.例如,当正在更新1000行时,使用多个UPDATE语句而不是1000个不同的条件对单个语句感觉并且看起来更好CASE.
但是,有时CASE声明更合适.例如,如果您要根据某些特征更新行,比如表的字段值的偶数或奇特性,那么CASE语句是一种非常简洁和可维护的方式来更新表中的行而不必诉诸于巨大的UPDATE所有共享特定逻辑类型的语句数.以此为例:
UPDATE table
SET val = CASE MOD(someproperty, 2)
WHEN 0 THEN x
WHEN 1 THEN y
END
Run Code Online (Sandbox Code Playgroud)
该表达式采用某些属性的模数,当为0(偶数)时,将值x赋值给val,当为1(奇数)时,将值y赋给val.此语句更新的数据量越大,与多个UPDATE语句相比,它就越清晰.
简而言之,CASE语句有时与UPDATE语句一样可读/可维护.这一切都取决于你想要用它们做什么.
编辑:添加ELSE子句是额外的安全.OP可能只对更新特定行感兴趣,因此其余部分应保持在UPDATE之前.
编辑:添加了一个场景,其中CASE语句是比多个UPDATE语句更有效的方法.
您不能为任何SQL语句使用多个WHERE子句,但是您可以使用CASE语句来完成您尝试执行的操作.您拥有的另一个选项是执行多个UPDATE语句.
以下是使用CASE语句的示例:
UPDATE table
SET val = (
CASE someproperty
WHEN 1 THEN X
WHEN 2 THEN Y
ELSE val
END
);
Run Code Online (Sandbox Code Playgroud)
以下是使用多个UPDATE语句的示例:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
Run Code Online (Sandbox Code Playgroud)