MySQL在更新查询中设置局部变量
我在存储过程中有以下查询:MySQL在更新查询中设置局部变量,mysql,sql,Mysql,Sql,我在存储过程中有以下查询: 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 WH
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';
有没有办法设置一些标志值“一”、“二”等。。。在局部变量中,当第一个或第二个存在时,第一个集合的CASE子句中的条件为true。然后我想使用该标志值设置另一个字段
这样的事情可能吗?我已经搜索了一段时间,但似乎找不到这个问题的充分解决方案
编辑:为会话/本地变量应更改的位置添加注释。此select查询提供1作为答案,并将@myvar设置为1
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';
它不会给出错误,但是如果没有数据,您必须自己测试它
我不确定session变量是否有vqalue。就像我说的,没有数据
但是仍然要事先设置会话变量,在update语句中使用它是没有意义的。这个select查询给您一个1作为答案,并将@myvar设置为1
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';
它不会给出错误,但是如果没有数据,您必须自己测试它
我不确定session变量是否有vqalue。就像我说的,没有数据
但是仍然要预先设置会话变量,在update语句中使用它是没有意义的。无法确定使用您希望的方式成功完成此查询,因为MySQL通常不能保证更新查询中集合求值的顺序!=放心。最安全的解决方案是重复您的现有条款:
优化器应该足够聪明,能够意识到子查询被多次使用,并重复使用结果。无法确定使用变量成功完成此查询,因为MySQL通常不能保证更新查询中集合求值的顺序!=放心。最安全的解决方案是重复您的现有条款:
优化人员应该足够聪明,能够意识到子查询被多次使用,并重复使用结果。示例输入和预期输出将非常有用。如果您是一个存储过程,请在update@nbk. 这不是我想要的。我更想寻找一种在更新查询中更改本地/会话变量值的方法。我希望这能进一步澄清我的意图。@user3303411。即使您可以这样做,我也不认为MySQL保证set语句的求值顺序,因此也不能保证变量在使用前已设置。@user3303411。我总是发现文档中的内容通常令人不安。您可以依赖顺序,也可以不依赖顺序。示例输入和预期输出将非常有用。如果您是一个存储过程,请在update@nbk. 这不是我想要的。我更想寻找一种在更新查询中更改本地/会话变量值的方法。我希望这能进一步澄清我的意图。@user3303411。即使您可以这样做,我也不认为MySQL保证set语句的求值顺序,因此也不能保证变量在使用前已设置。@user3303411。我总是发现文档中的内容通常令人不安。要么你可以相信订单,要么你不能。谢谢你的回答。我也在想一个类似的方法,但它看起来很粗糙。我想在这一点上,我们应该重新审视一下设计本身,看看是否有更好的方法可用。问题是,没有人确切地知道每件事是如何运作的。我个人认为它必须是确定性的,mysql从strat-tp到最后都能工作,但是优化可能会带来其他结果,但是请尝试一下,看看它是否能工作。你的查询在mysql v8社区版中工作得很好。谢谢你的回答。我也在想一个类似的方法,但它看起来很粗糙。我想在这一点上,我们应该重新审视一下设计本身,看看是否有更好的方法可用。问题是,没有人确切地知道每件事是如何运作的。我个人认为它必须是确定性的,mysql从strat-tp到最后都可以工作,但是优化可能会带来其他结果,但是请尝试一下,看看它是否工作。您的查询在mysql v8社区版中工作得很好。您的观点是正确的。如果没有保证,就不应该依赖它,特别是如果它违反了标准。使迁移到其他系统变得更加困难。谢谢,你说得对。如果没有保证,就不应该依赖它,特别是如果它违反了标准。使迁移到其他系统变得更加困难。谢谢