【发布时间】:2020-04-07 06:32:31
【问题描述】:
使用 Oracle 12c DB,我有以下表格数据示例,在使用 SQL 和 PL/SQL 时需要帮助。
表格数据如下:
Table Name: my_data
ID ITEM ITEM_LOC
------- ----------- ----------------
1 Item-1 0,1
2 Item-2 0,1,2,3,4,7
3 Item-3 0-48
4 Item-4 0,1,2,3,4,5,6,7,8
5 Item-5 1-33
6 Item-6 0,1
7 Item-7 0,1,5,8
使用my_data 表中的上述数据,处理此 ITEM_LOC 的最佳方法是什么,因为我需要将此列中的值用作单个值,即:
0,1 表示 SQL 需要返回 0 或 1 或
范围值,即:
0-48 表示 SQL 需要返回 0 到 48 之间的值。
两种场景的返回值都应该从最低到最高开始,一旦处理就不能重复使用。
基于以上所述,根据我上面的描述,如果有一个函数可以获取 ID 并从 ITEM_LOC 返回一个尚未使用的单独值,那就太好了。这可以是逗号分隔的字符串值或范围字符串值。
ID = 2 的期望结果可能是 7。对于这个 ID = 2,ITEM_LOC = 7 不能再次使用。
ID = 5 的期望结果可能是 31。对于这个 ID = 5,ITEM_LOC = 31 不能再次使用。
对于无法再次使用的 ITEM_LOC 数据,针对该 ID,我正在考虑使用另一个表来保存该 ID,或者可能将所有数据分成单独的行,并使用一个名为 VALUE_USED 的新列。
【问题讨论】:
-
永远不要将数据存储为逗号分隔的项目。只会给你带来很多麻烦。
-
“不能重复使用”是否意味着该函数还应该删除从存储在列中的列表中返回的 ID(即同时更新表)
-
@jarlh - 完全同意你的看法,但这是预先存在的数据。
-
@a_horse_with_no_name "can't be re-used" 表示 ID 可以重复使用,但 ITEM_LOC 列中的值(如果已使用)不能再次使用。例如,我只能为此 ID 使用 ITEM_LOC 值六次,即 0、1、2、3、4、7。如果我使用了 0,那么我的下一个可用值将是 1 等等。希望这是有道理的。
-
但是您将使用 ID 的信息存储在哪里?从列表中删除使用过的似乎是唯一的选择(考虑到您损坏的数据库设计)。或者你有另一个存储使用值的表吗?
标签: sql oracle plsql oracle12c