Oracle11g 在Oracle DB中查找两列之间的值范围

Oracle11g 在Oracle DB中查找两列之间的值范围,oracle11g,Oracle11g,嗨,我有一个表,其中有两列的范围,例如,如果范围开始=ABC1/000/0/0000,范围结束=ABC1/000/0/1022 我必须得到这个范围内的所有值,然后将它与另一个表连接起来。您能告诉我如何获得双表中的所有值吗。我正在使用Oracle11g 基本上,我需要做一个列表,第一个值为ABC1/000/0/0000,第二个值为ABC1/000/0/0001,直到ABC1/000/0/1022。我不知道您临时用双精度存储值是什么意思。DUAL是具有单个值的单列表 然而,像这样的东西可能是你想要的

嗨,我有一个表,其中有两列的范围,例如,如果范围开始=ABC1/000/0/0000,范围结束=ABC1/000/0/1022

我必须得到这个范围内的所有值,然后将它与另一个表连接起来。您能告诉我如何获得双表中的所有值吗。我正在使用Oracle11g


基本上,我需要做一个列表,第一个值为ABC1/000/0/0000,第二个值为ABC1/000/0/0001,直到ABC1/000/0/1022。

我不知道您临时用双精度存储值是什么意思。DUAL是具有单个值的单列表

然而,像这样的东西可能是你想要的。如果不是,那么也许你可以进一步阐述你的问题

select blah
from another_table
where somekey in
  ( select blah
    from table
    where col between <rangeStart> and <rangeEnd>
   )

看来你需要一些东西

从斜杠分隔的字符串中分隔最后一个值,例如 ABC1/000/0/0000。最好使用标准substr和 instr函数,不带正则表达式,速度更快 处决在instr中,我们可以对 事件,表示从字符串末尾开始计数。 大概是这样的:

选择范围从、子排列从、插入从、“/”、-1+1 从

实际上,您需要将其转换为一个带有to_编号的数字,以便进一步处理,并且还需要捕获到最后一个斜杠的子字符串,类似于substr和instr的用法。对于range_to,您也需要这样做

生成从第一个值到最后一个值的所有数字。这可以通过级别连接查询分层查询轻松完成。由于可能需要同时对多个输入行和输入范围执行此操作,因此必须小心

然后将所有内容放回一起,并将结果用于进一步处理

我将假设范围_from string至少包含一个斜杠,最后一个斜杠和字符串结尾之间的子字符串表示字符格式的非负整数,范围_to同样包含至少一个斜杠,并且从最后一个斜杠到字符串结尾的子字符串表示非负整数。您有责任确保该整数大于或等于范围_-from中的整数。在输出中,我将使用相同的子字符串直到最后一个斜杠,正如我在范围_from中找到的一样;如果要求范围必须具有相同的初始子字符串,则您有责任保证这一点

我还将假设字符串中最后一个标记的数字部分的字符宽度数事先未知,必须在查询中计算

with
     test_data( id, range_from, range_to ) as (
       select 1, 'ABC1/000/0/2033', 'ABC1/000/0/2035' from dual union all
       select 2, 'xyz/33/200'     , 'xyz/33/200'      from dual union all
       select 3, '300/LMN/000'    , '300/LMN/003'     from dual
     )
--  end of test data; SQL query begins below this line
select id, stub || lpad(to_char(from_nbr + level - 1), len, '0') as val
from (
   select id, stub, length(from_str) as len, to_number(from_str) as from_nbr,
                                             to_number(to_str)   as to_nbr
   from ( 
      select id, substr(range_from, 1, instr(range_from, '/', -1))  as stub,
                 substr(range_from, instr(range_from, '/', -1) + 1) as from_str,
                 substr(range_to  , instr(range_to  , '/', -1) + 1) as to_str
      from test_data
   )
)
connect by level <= 1 + to_nbr - from_nbr
       and prior id = id
       and prior sys_guid() is not null
order by id, level                               --  if needed
;

ID VAL
-- --------------------
 1 ABC1/000/0/2033
 1 ABC1/000/0/2034
 1 ABC1/000/0/2035
 2 xyz/33/200
 3 300/LMN/000
 3 300/LMN/001
 3 300/LMN/002
 3 300/LMN/003

?? 这是什么意思?范围是指最小值和最大值之间的一系列值。范围1和范围2可能指单个范围,而不是两个不同的范围。但是对于每一个,你给出四个值,一个字符串和三个数字。你在说什么范围?如何一次存储四个值?它们是否在一列中,就像那样,作为斜杠分隔的字符串?您尝试过中间值吗?@GordonLinoff-连接到一个表,每个表的值在一个范围内,每行一个值,与在中间值条件下连接完全不同。ABC1/000/0/0000是存储在一列中的单个值,这基本上是一个斜杠分隔的字符串。这是一个范围示例,在real senario中,范围开始和范围结束之间的距离可能超过100K。我必须将它们临时存储在DUAL中,然后将此列表与另一个表连接起来。不,这不是一个范围的示例。范围的例子有:1。从A到K的信。数字从0到2000。3.日期为2013年1月1日至2014年1月1日。你所说的ABC1/000/0/0000范围是什么意思?如果你使用的“范围”一词的含义与通常不同,你需要解释它是什么。正如我在回复另一位发帖人的评论时所解释的,该评论与你的回答类似:加入一个范围内每个值有一行的表与加入中间条件不同。@mathguy我同意。但是你真的知道拉曼迪普先生想要什么吗?我看起来确实有点模糊;我认为他在评论交流的最后澄清了原帖。我将编辑他的帖子——我将把这一评论复制到问题的正文中。