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

问题描述

我是 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 出现语法错误

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

解决方法

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

您可以使用一个子查询来连接表,该子查询会为每一行获取此值。

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。它还将所有值放在一个地方,这样维护和验证起来会更简单。