将 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
列的当前值。
我正在尝试使用 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
SET c.estado = IF(c.estado IS NULL,'I',c.estado)
如果布尔表达式(IF() 函数中的第一个参数)的计算结果为 TRUE,则 return 第二个参数的计算结果(在本例中为 'I'
),否则, return estado
列的当前值。