我需要创建一个用于操作数据的表,这个表已经提供给我:
col1 col2 col3
1 < 3 50%
2 < 5 50%
3 < 10 50%
1 5>RC >=3 25%
2 10>RC >=5 25%
3 20>RC >=10 25%
1 >=5 0%
2 >=10 0%
3 >=20 0%
系统的用户将传递一个号码,该号码位于col2
和col1
上方。假设用户为col2传递了7,为col1传递了1。业务要求是我应该向用户返回以下行
1 >=5 0%
粗略地说,这意味着我检查了col2
中的值,并注意到它是>=5
,我的输入数据适合。
我在考虑将col2
拆分为两列 - 一列用于存储号码,另一列用于运营商。像这样:
col1 col2 col3 col4
1 3 50% <
2 5 50% <
3 10 50% <
1 5>RC >=3 25%
2 10>RC >=5 25%
3 20>RC >=10 25%
1 5 0% >=
2 10 0% >=
3 20 0% >=
通过这种方式,我将能够根据第一列和最后三列中的数据编写查询以解决查询问题(尽管我现在还没有运行查询,我只是干运行)。到目前为止我无法弄清楚的是 - 如何处理第4,5,6行中的数据?您可以忽略这些行中的RC
部分,因为我当然可以取消它,因为我关心的是查询的数字范围。
我尝试将行4,5,6的数据分成2行,类似于:
1 3 25% >=
1 5 25% <
2 5 25% >=
2 10 25% <
3 10 25% >=
3 20 25% <
但是,在检索数据方面,我看到了一个迫在眉睫的问题。假设用户使用了col2 = 7 AND col1 = 1
。现在,我应该只拿到了一排,即行号7在我的问题第一个表,但我也得到一个额外的行(第1行中的最后一个表,在那里我是分割数据BETWEEN条件)
有人能建议我更好地存储这些数据,以便实现我的需求吗?
SQLFiddle演示:http://www.sqlfiddle.com/#!4/d2d90/7
答案 0 :(得分:1)
我建议你应该将col2分成两列 - 下限和上限,替换不存在的绑定,例如,使用NULL。它看起来像这样:
+----+-------+-------+----+
|col1|col2_lb|col2_hb|col3|
+----+-------+-------+----+
|1 |NULL |3 |50% |
+----+-------+-------+----+
|2 |NULL |5 |50% |
+----+-------+-------+----+
|3 |NULL |10 |50% |
+----+-------+-------+----+
|1 |3 |5 |25% |
+----+-------+-------+----+
|... |... |... |... |
+----+-------+-------+----+
|1 |5 |NULL |0% |
+----+-------+-------+----+
使用此结构,您将能够通过简单查询找到所需的行:
SELECT *
FROM T_TABLE t
WHERE t.col1 = :VAL1
AND NVL(t.col2_lb,:VAL2) <= :VAL2
AND NVL(t.col2_hb,:VAL2+1) > :VAL2