我有一个'Port'INT列,它的范围应该是30000到50000.
所以,我有一个存储过程插入值(端口是非空).所以我必须选择"手动"存储在该字段上的值.问题是,尽管我可以在某一点逐步插入(30000,30001,30002 ....)一些条目被删除(它因为30000,30002,30004 ....)所以有空洞要设置.
我需要在我的SP中放置一个适合这些孔的方法(例如我有30001,30003 ......).我的问题是如何在SP中检查,如果某个值已经"ocuppied".
我想从MySQL使用LOOP.试过这样的事情:
CREATE PROCEDURE teste()
BEGIN
DECLARE p INT;
DECLARE aux INT;
SET p = 30000;
label1: LOOP
SELECT Port FROM Reg WHERE Port = p INTO aux;
IF p = 50000 THEN
LEAVE label1;
END IF;
IF aux IS NULL THEN -- aux-1 is not null, so I can verify the "next miminum available position"
aux = aux - 1;
LEAVE label1;
ELSE
SET p = p + 1;
ITERATE label1;
END IF;
END LOOP label1;
RETURN aux;
END $$
Run Code Online (Sandbox Code Playgroud)
我的问题是获得结果值.如果我放置RETURN语句,我将获得仅在FUNCTION上允许的信息.当我结束循环时,SELECT的结果总是为null.
我能做什么?
以下是您在序列中查找缺失值的方法.
SELECT a.id+1 AS start, MIN(b.id) - 1 AS end
FROM seq AS a, seq AS b
WHERE a.id < b.id
GROUP BY a.id
HAVING start < MIN(b.id)
Run Code Online (Sandbox Code Playgroud)
示例输出:
+-------+------+
| start | end |
+-------+------+
| 4 | 4 |
| 7 | 9 |
+-------+------+
Run Code Online (Sandbox Code Playgroud)
这意味着id序列中的值4缺失,并且数字也从7到9(包括).
通过替换相应的名称来调整此代码以满足您的需求.
| 归档时间: |
|
| 查看次数: |
1708 次 |
| 最近记录: |