我在存储过程中有以下查询:
SET @myVar = '';
UPDATE `my_table` t1
SET
t1.field1 = CASE
WHEN
-- set @myVar to 'one' when this exists is true
EXISTS (
SELECT 1
FROM `table2` t2
WHERE t1.field1 = t2.field1
) OR
-- set @myVar to 'two' when this exists is true
EXISTS (
SELECT 1
FROM `table3` t3
WHERE t1.field1 = t3.field1
)
THEN FALSE
ELSE
TRUE
END,
t1.field3 = CASE
WHEN
@myVar = 'one'
THEN 'okay'
WHEN
@myVar = 'two'
THEN 'not okay'
ELSE
'netural'
END
WHERE t1.field5 = 'value';
当第一个EXISTS
的CASE
子句中的第一个或第二个set
条件为真时,是否可以在局部变量中设置一些标志值(“一个”,“两个”等) ]。然后,我想使用该标志值设置另一个字段。
是否有可能这样?我搜索了一段时间,但似乎无法为该问题找到足够的解决方案。
EDIT:添加了有关会话/本地变量应更改位置的注释。
此选择查询为您提供1作为答案,并将@myvar设置为一个
SELECT IF(IF(EXISTS (SELECT 1 FROM `df` t3 WHERE 1 = 1), @myVar :='one',0) = 'one',1,0);
SELECT @myVar;
所以尝试
UPDATE `my_table` t1
SET
t1.field1 = CASE
WHEN
IF(IF(
EXISTS (
SELECT 1
FROM `table2` t2
WHERE t1.field1 = t2.field1
), @myVar :='one',0) = 'one',1,0) OR
IF(IF(
EXISTS (
SELECT 1
FROM `table3` t3
WHERE t1.field1 = t3.field1
), @myVar :='two',0) = 'one',1,0)
THEN FALSE
ELSE
TRUE
END,
t1.field3 = CASE
WHEN
@myVar = 'one'
THEN 'okay'
WHEN
@myVar = 'two'
THEN 'not okay'
ELSE
'netural'
END
WHERE t1.field5 = 'value';
它没有给出错误,但是没有数据,您必须自己进行测试
而且我不确定会话变量是否具有vqalue。就像我说没有数据。
但是仍然将会话预先设置为可变,在更新语句中没有意义。
[无法确定您使用变量想要成功完成此查询,因为MySQL无法保证SET
查询中UPDATE
评估的顺序(“通常”!=“保证”) 。最安全的解决方案是重复您的EXISTS
子句:
UPDATE `my_table` t1
SET
t1.field1 = CASE
WHEN
EXISTS (
SELECT 1
FROM `table2` t2
WHERE t1.field1 = t2.field1
) OR
EXISTS (
SELECT 1
FROM `table3` t3
WHERE t1.field1 = t3.field1
)
THEN FALSE
ELSE
TRUE
END,
t1.field3 = CASE
WHEN
EXISTS (
SELECT 1
FROM `table2` t2
WHERE t1.field1 = t2.field1
)
THEN 'okay'
WHEN
EXISTS (
SELECT 1
FROM `table3` t3
WHERE t1.field1 = t3.field1
)
THEN 'not okay'
ELSE
'netural'
END
WHERE t1.field5 = 'value';
优化器应该足够聪明,以意识到子查询被多次使用并重新使用结果。