将 IF 与更新一起使用 MYSQL

USING IF with UPDATE MYSQL

我正在尝试使用 IF 函数进行更新

IF(SELECT 'FUNCION' FROM tickets 
  WHERE (FUNCION = COR) AND (tickets.CLIENTE=clientes.CLIENTE)) 
THEN UPDATE `clientes` SET `ESTADO` = 'I';

我试过了,但似乎有语法错误。

我怎样才能让它工作?

编辑:我想将 'ESTADO' 更新为 'I' 如果 'FUNCION' 从另一个 table 是 'COR' 并且字段 'CLIENTE' 相互匹配。

这不是您编写条件更新的方式。使用 where 子句:

UPDATE clientes
SET estado='I'
WHERE (funcion = cor) AND (tickets.client=clients.cliente)

这行不通,因为您指的是未加入查询的 fields/tables。

您可以在 UPDATE 语句中使用连接操作。

我不清楚 COR 是什么引用,所以我假设它应该是字符串文字,而不是对列名的引用。

这是一个例子:

UPDATE clientes c
  JOIN tickets t
    ON t.cliente = c.cliente
   AND t.funcion = 'COR'
   SET c.estado = 'I'

也就是说,找到 clientes 中所有在 tickets 中有 "matching" 行的行,然后将这些行的 estado 列设置为 'I'行。


这样想......先写一个SELECT查询来识别你想更新的行,然后过滤掉你不想更新的行。

SELECT c.*             -- please don't use * in code in applications! 
     , t.funcion
  FROM clientes c
  JOIN tickets t
    ON t.cliente = c.cliente
   AND t.funcion = 'COR'

--或者--

SELECT c.*
  FROM clientes c
 WHERE EXISTS ( SELECT 1
                  FROM tickets t
                 WHERE t.cliente = c.cliente
                   AND t.funcion = 'COR'
               )

一旦 SELECT 语句工作(仅检索要更新的行),您可以将其转换为 UPDATE,方法是将 SELECT ... FROM 替换为关键字UPDATE,并在WHERE子句前加一个SET子句。

还有一些"tricks"我们可以在SET中的表达式中发挥作用,做一些条件赋值。要保持该列不变,请将当前值重新分配给该列。

例如,仅替换 estado

的 NULL 值
  SET c.estado = IF(c.estado IS NULL,'I',c.estado)

如果布尔表达式(IF() 函数中的第一个参数)的计算结果为 TRUE,则 return 第二个参数的计算结果(在本例中为 'I'),否则, return estado 列的当前值。