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
。它还将所有值放在一个地方,这应该使维护和验证更简单。
我是 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
。它还将所有值放在一个地方,这应该使维护和验证更简单。