[MySQL在更新查询中设置局部变量

问题描述 投票:1回答:2

我在存储过程中有以下查询:

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';

当第一个EXISTSCASE子句中的第一个或第二个set条件为真时,是否可以在局部变量中设置一些标志值(“一个”,“两个”等) ]。然后,我想使用该标志值设置另一个字段。

是否有可能这样?我搜索了一段时间,但似乎无法为该问题找到足够的解决方案。

EDIT:添加了有关会话/本地变量应更改位置的注释。

mysql sql
2个回答
0
投票

此选择查询为您提供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。就像我说没有数据。

但是仍然将会话预先设置为可变,在更新语句中没有意义。


0
投票

[无法确定您使用变量想要成功完成此查询,因为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';

优化器应该足够聪明,以意识到子查询被多次使用并重新使用结果。

© www.soinside.com 2019 - 2024. All rights reserved.