首页 > 解决方案 > 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 出现语法错误。

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

标签: mysqlsqldatabaseuser-defined

解决方案


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

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

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

推荐阅读