gpt4 book ai didi

MySQL重复数据删除与循环

转载 作者:行者123 更新时间:2023-11-30 22:05:06 24 4
gpt4 key购买 nike

我有一个名为 Positions 的表,其中包含如下数据:

Id PositionId
1 'a'
2 'a '
3 'b '
4 'b'

其中一些有空格,所以我的想法是删除这些空格,这不是实际的表,只是一个包含更多数据的表的示例。所以我创建了程序来迭代 PositionIds 并比较它们,如果修剪它们匹配删除其中之一:

CREATE PROCEDURE remove_double_positions()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE current VARCHAR(255);
DECLARE previous VARCHAR(255) DEFAULT NULL;
DECLARE positionCur CURSOR FOR SELECT PositionId FROM Positions ORDER BY PositionId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN positionCur;
clean_duplicates: LOOP
FETCH positionCur INTO current;
IF done THEN
LEAVE clean_duplicates;
END IF;
IF previous LIKE current THEN
DELETE FROM Positions WHERE PositionId = current;
END IF;
SET previous = current;
END LOOP clean_duplicates;
CLOSE positionCur;
END

出于某种原因,它显示有 2 行受到影响,但实际上删除了所有 4 行,我不知道为什么,你能帮我吗。

最佳答案

来自手册https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_like在 like 运算符下 - 根据 SQL 标准,LIKE 在每个字符的基础上执行匹配,因此它可以产生不同于 = 比较运算符的结果:...特别是,尾随空格很重要,这对于 CHAR 或使用 = 运算符执行的 VARCHAR 比较:

mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
1 row in set (0.00 sec)
  • 当在 where 或 case 中使用 = 或 like 时,这是正确的。

如果您将删除位修改为

,您的过程将按预期工作
 IF trim(previous) = trim(current) THEN
DELETE FROM Positions WHERE PositionId like current;
END IF;

关于MySQL重复数据删除与循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42069994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com