MySQL:使用用户定义的变量更新查询

MySQL: Updating Query with user defined variable

我是 SQL 的新手,无法在不使用存储过程的情况下找到使用用户定义变量的直接方法。 SUBSTRING_INDEX(REFERENCE) 被多次调用,看起来效率很低。 以下是我上一个问题的示例代码。

UPDATE TABLE 
SET TYPE = (CASE WHEN SUBSTRING_INDEX(REFERENCE, '_', -1) = 'A'  
                 THEN 1
                 WHEN SUBSTRING_INDEX(REFERENCE, '_', -1) = 'B'  
                 THEN 2
                 ELSE TYPE
            END),
    COLOR = (CASE WHEN SUBSTRING_INDEX(REFERENCE, '_', -1) = 'A'  
                  THEN 'BLUE'
                  WHEN SUBSTRING_INDEX(REFERENCE, '_', -1) = 'B'  
                  THEN 'RED'
                  ELSE COLOR
             ...

添加SET @rule_id = SUBSTRING_INDEX(CELERITY_MATCH_REF, '_', 1) FROM ilms_tran_cashflows_match 在顶部并使用 @rule_id 导致 HeidiSQL.

出现语法错误

正确的方法是什么或者这是不可能的?

您不能将变量设置为多行,只能设置一个值。

您可以将 table 与为每一行获取此值的子查询联接。

UPDATE TABLE as t1
JOIN (
    SELECT id, SUBSTRING_INDEX(REFERENCE, '_', -1) AS suffix
    FROM TABLE
) AS t2 ON t1.id = t2.id
SET TYPE = CASE suffix
        WHEN 'A' THEN 1
        WHEN 'B' THEN 2
    END,
    COLOR = CASE suffix
        WHEN 'A' THEN 'BLUE'
        WHEN 'B' THEN 'RED'
    END
WHERE suffix IN ('A', 'B')

我实际上建议通过将值放在子查询中来做到这一点:

UPDATE TABLE t JOIN
       (SELECT 'A' as SUFFIX, 1 as TYPE, 'BLUE' as COLOR UNION ALL
        SELECT 'B' as SUFFIX, 2 as TYPE, 'RED' as COLOR
       ) x
       ON SUBSTRING_INDEX(t.REFERENCE, '_', -1) = x.SUFFIX
    SET t.TYPE = x.type,
        t.COLOR = x.color;

这完全删除了 CASE 表达式并将逻辑简化为单个 JOIN。它还将所有值放在一个地方,这应该使维护和验证更简单。