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