Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在更新查询中设置局部变量_Mysql_Sql - Fatal编程技术网

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社区版中工作得很好。您的观点是正确的。如果没有保证,就不应该依赖它,特别是如果它违反了标准。使迁移到其他系统变得更加困难。谢谢,你说得对。如果没有保证,就不应该依赖它,特别是如果它违反了标准。使迁移到其他系统变得更加困难。谢谢