我正在尝试在PHP中创建一个SQL查询来更新表。 是否可以为每个受影响的行设置不同的 WHERE 子句?

例如:

UPDATE table 
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2

等?

任何帮助表示赞赏。感谢

有帮助吗?

解决方案

任何SQL语句都不能有多个WHERE子句,但是您可以使用CASE语句来完成您尝试执行的操作。您拥有的另一个选项是执行多个UPDATE语句。

以下是使用CASE语句的示例:

UPDATE table
SET val = (
    CASE someproperty
        WHEN 1 THEN X
        WHEN 2 THEN Y
        ELSE val
    END
);

以下是使用多个UPDATE语句的示例:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

其他提示

是的,您可以使用CASE声明。

UPDATE table
SET val = CASE someproperty  
           WHEN 1 THEN x 
           WHEN 2 THEN y
           ....
          ELSE
           val
          END

现在,担心与几个 UPDATE 语句相比,一个 CASE 语句的可读性较差。这里有一个有效的论点。例如,当更新1000行时,使用多个 UPDATE 语句而不是1000个不同的条件来使用单个 CASE 感觉并且看起来更好。

但是,有时CASE声明更合适。例如,如果您要根据某些特征更新行,请说明字段值的偶数或奇数性质,那么 CASE 语句是一种非常简洁且可维护的方式来更新表,而不必诉诸于大量共享特定类型逻辑的 UPDATE 语句。以此为例:

UPDATE table
SET val = CASE MOD(someproperty, 2)  
           WHEN 0 THEN x 
           WHEN 1 THEN y
          END

此表达式采用someproperty的模数,当为0(偶数)时,将值x赋值给val,当为1(奇数)时,将值y赋给val。此语句更新的数据量越大,与多个 UPDATE 语句相比,它就越清晰。

简而言之, CASE 语句有时与 UPDATE 语句一样可读/可维护。这完全取决于你试图用它们做什么。

编辑:添加ELSE子句是额外安全的。 OP可能只对更新特定行感兴趣,因此其余部分应保持在UPDATE之前。

编辑:添加了一个场景,其中 CASE 语句比多个 UPDATE 语句更有效。

不。进行两次更新:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

第二个想法,你可以使用子查询或案例陈述......

UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )

您可能需要制作如下的子查询:

UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

紧凑且易于扩展的方式:

UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);

以这种方式进行查询:

$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";

如果处理字符串值,请使用prepare_query来避免SQL语法错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top