是否可以在 MySQL 中使用数字范围?如果可以,完成以下任务的最佳方法是什么。
- 我有两个表格列的范围。
+------+-------+--------+ | Col1 | Col2 | Action | +------+-------+--------+ | 1 | 100 | Add | +------+-------+--------+
- 接下来,我想减去范围 [60,65],减去范围 [20, 40] 并加上范围 [200,210]。所以我将这些记录添加到我的表中。
+------+-------+--------+ | Col1 | Col2 | Action | +------+-------+--------+ | 1 | 100 | Add | | 60 | 65 | Subtr | | 20 | 40 | Subtr | | 200 | 210 | Add | +------+-------+--------+
- 最后,我想检索剩余的范围。查询应返回类似这样的内容。
+------+-------+ | Col1 | Col2 | +------+-------+ | 1 | 19 | | 41 | 59 | | 66 | 100 | | 200 | 210 | +------+-------+
额外信息
- 业务逻辑防止范围重叠
- 业务逻辑防止减去不在可用范围内的范围
最佳答案
试试这个:
SELECT (CASE WHEN Action1 = 'Add' THEN col1
WHEN Action1 = 'Subtr' THEN col1 + 1
ELSE 0
END) col1,
(CASE WHEN Action2 = 'Add' THEN col2
WHEN Action2 = 'Subtr' THEN col2 - 1
ELSE 0
END) col2
FROM (SELECT CEILING(RowNum / 2) AS RowId,
MAX(CASE WHEN RowNum % 2 = 1 THEN col ELSE 0 END) AS col1,
MAX(CASE WHEN RowNum % 2 = 1 THEN Action ELSE '' END) AS Action1,
MAX(CASE WHEN RowNum % 2 = 0 THEN col ELSE 0 END) AS col2,
MAX(CASE WHEN RowNum % 2 = 0 THEN Action ELSE '' END) AS Action2
FROM (SELECT (@id:=@id+1) AS RowNum, col, Action
FROM (SELECT col1 AS col, Action
FROM tableA
UNION
SELECT col2 AS col, Action
FROM tableA
) AS A,
(SELECT @id:=0) AS B
ORDER BY col
) AS A
GROUP BY RowId
) AS A;
检查这个SQL FIDDLE DEMO
输出
| COL1 | COL2 |
|------|------|
| 1 | 19 |
| 41 | 59 |
| 66 | 100 |
| 200 | 210 |
::解释::
正如您在我的查询中看到的那样,首先我获取了单列中的所有开始范围和结束范围及其操作类型,然后为每条记录提供了一个行号以将该数据转置为两列,因为我想创建内表如下:
| ROWID | COL1 | ACTION1 | COL2 | ACTION2 |
|-------|------|---------|------|---------|
| 1 | 1 | Add | 20 | Subtr |
| 2 | 40 | Subtr | 60 | Subtr |
| 3 | 65 | Subtr | 100 | Add |
| 4 | 200 | Add | 210 | Add |
最后我使用了 CASE 语句来生成特定的输出。
关于mysql - 对数字范围 mysql 执行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585801/