Oracle 中的 SQL 查询查找 varchar 列中表示的范围字段内的数字
我在 Oracle 中有 Colors
表,其中包含如下数据:
ID Color Ranges (nvarchar2!)
-- ----- -------------------------
1 Blue 1-9,23.5-25.1,27.11,99.14
2 Red 4
3 Green 4.44-5.3
4 Black 18-22,101
正如您所猜测的,Ranges
列代表一些数字和数字范围。
我无法将范围保存在其他一些表中(例如带有 ColorID
、MinVal
、的
),但我可以以某种方式标准化此RangesTable
MaxVal范围
列(始终排序,或者将单个数字表示为范围(“4 -4
”而不是“4
”),等等)。
问题:我正在寻找一种根据此字段查询 Oracle 的方法,通过询问它:我有哪些颜色(或 ids...),其范围包含 5 ?(答案是蓝色和绿色),或者哪种颜色与“5-6”范围重叠?(答案同样是蓝色 [1-9] 和绿色 [4.44-5.3] ])。
怎么办呢? (我想正则表达式在这里没有帮助......)。
编写能够分割这些范围并在其中搜索的数据库内函数是否明智?还有其他建议吗?
谢谢你!
I have Colors
table in Oracle, with data like:
ID Color Ranges (nvarchar2!)
-- ----- -------------------------
1 Blue 1-9,23.5-25.1,27.11,99.14
2 Red 4
3 Green 4.44-5.3
4 Black 18-22,101
As you can guess, the Ranges
column represents some numbers and numbers-ranges.
I can't save the ranges in some other tables (like RangesTable
with ColorID
, MinVal
, MaxVal
), but I can normalize this Ranges
-column in some ways (allways sorted, or, represting single-numbers as ranges ("4-4
" instead of "4
"), or such).
The problem: I'm searching for a way to query my Oracle according to this field, by asking it: Which colors (or ids...) do I have that its ranges contains 5? (the answer is Blue and Green), or Which color overlaps "5-6" range? (answer is, again, Blue [1-9] and Green [4.44-5.3]).
How can it be done? (I guess Regex won't help here...).
Is it sensable to write in-DB function that capable to split those ranges and search in it? Any other suggestion?
Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以通过此查询获取您的范围:
问候,
抢。
You can get your ranges with this query:
Regards,
Rob.
您可以创建一个像这样的 PL/SQL 函数:
如果值包含在范围内,则返回 1,如果不包含,则返回 0,并且可以像这样使用:
可以编写类似的函数来处理重叠范围:
注意: apex_util.string_to_table 函数在最新版本的 Oracle 中作为标准提供;在早期版本中,您可能需要编写自己的字符串解析器函数,例如 这个
You could create a PL/SQL function like this:
This returns 1 if the value is included in the range(s), 0 if not and can be used like this:
A similar function could be written to handle overlapping ranges:
Note: the apex_util.string_to_table function is available as standard in recent versions of Oracle; in earlier versions you may need to write your own string parser function like this one
我通过使用 SQL 嵌套表和管道函数来提供第三个选项来完成此操作。
首先创建SQL类型和相关的嵌套表:
然后创建一个可以解码范围列的管道函数。该函数可能可以轻松地重写以利用上面使用的 apex_util.string_to_table 函数。
然后运行以下查询来检索数据:
I have done this by using a SQL nested table and a pipelined function to provide a third option.
Firstly create the SQL type and related nested table:
Then create a pipelined function that can decode the range column. The function can probably easily be rewritten to take advantage of the apex_util.string_to_table function used above.
Then run the following query to retrieve the data: