【问题标题】:which function should i use to solve我应该使用哪个函数来解决
【发布时间】:2012-07-19 04:30:29
【问题描述】:

假设我在下面给出了一个范围

400001 - 400104
400601 - 400614
400701 - 400710
401101
401104
401105
401107
401201
401202
401203
401207
401209
401301
401303
421001 - 421005
421201
421202
421203
421204
421301
421304
421306

我必须在下面给定的范围内找到数据,而不是告诉我最简单的方法。 我在函数中使用并解决了它,但是如果有更多的范围会变得更加乏味

IN
          (400001, 400002, 400003, 400004, 400005, 400006, 400007, 400008,
           400009, 400010, 400011, 400012, 400013, 400014, 400015, 400016,
           400017, 400018, 400019, 400020, 400021, 400022, 400023, 400024,
           400025, 400026, 400027, 400028, 400029, 400030, 400031, 400032,
           400033, 400034, 400035, 400036, 400037, 400038, 400039, 400040,
           400041, 400042, 400043, 400044, 400045, 400046, 400047, 400048,
           400049, 400050, 400051, 400052, 400053, 400054, 400055, 400056,
           400057, 400058, 400059, 400060, 400061, 400062, 400063, 400064,
           400065, 400066, 400067, 400068, 400069, 400070, 400071, 400072,
           400073, 400074, 400075, 400076, 400077, 400078, 400079, 400080,
           400081, 400082, 400083, 400084, 400085, 400086, 400087, 400088,
           400089, 400090, 400091, 400092, 400093, 400094, 400095, 400096,
           400097, 400098, 400099, 400100, 400101, 400102, 400103, 400104,
           400601, 400602, 400603, 400604, 400605, 400606, 400607, 400608,
           400609, 400610, 400611, 400612, 400613, 400614, 400701, 400702,
           400703, 400704, 400705, 400706, 400707, 400708, 400709, 400710,
           401101, 401104, 401105, 401107, 401201, 401202, 401203, 401207,
           401209, 401301, 401303, 421001, 421002, 421003, 421004, 421005,
           421201, 421202, 421203, 421204, 421301, 421304, 421306)

【问题讨论】:

  • 能否请您多解释一下您需要在其中找到什么。因为我认为一个简单的select * from tab_name where col_name = key_to_search;
  • 范围在哪里?他们在另一张桌子上吗?
  • alex poole no range are not from another table user has provided me xls sheet where range is given

标签: sql oracle oracle10g


【解决方案1】:

除了乏味之外,in 有 1000 个值的限制,如果你有很大的范围,你可能会达到。

如果您可以将 Excel 数据转换为可以生成文本以形成 CTE 的格式,您可能可以使用公式执行此操作,您可以执行以下操作:

with tmp_tab as (
    select 400001 as range_from, 400104 as range_to from dual
    union all select 400601, 400614 from dual
    union all select 400701, 400710 from dual
    union all select 401101, null from dual
    union all select 401104, null from dual
    union all select 401105, null from dual
    union all select 401107, null from dual
    union all select 401201, null from dual
    union all select 401202, null from dual
    union all select 401203, null from dual
    union all select 401207, null from dual
    union all select 401209, null from dual
    union all select 401301, null from dual
    union all select 401303, null from dual
    union all select 421001, 421005 from dual
    union all select 421201, null from dual
    union all select 421202, null from dual
    union all select 421203, null from dual
    union all select 421204, null from dual
    union all select 421301, null from dual
    union all select 421304, null from dual
    union all select 421306, null from dual
)
select st.id, st.data
from some_table st
join tmp_tab tt on st.id between tt.range_from
    and nvl(tt.range_to, tt.range_from);

因此,您可以根据 Excel 数据构建一个公用表表达式,其中包含范围从和范围到;如果您只有一个数字,则可以将 range-to 保留为 null 并稍后使用 nvl 使其成为虚拟范围;然后在表格中查找任何范围内的数据。

棘手的一点是生成 CTE,但即使从您拥有的数据手动执行此操作也比手动将每个范围扩展到所有单独的值更容易。

【讨论】:

    【解决方案2】:

    我认为使用 IN 是不可能的,但您可以将数据插入到临时表或表变量中:

    DECLARE @table TABLE (value int)
    INSERT INTO @table VALUES (400001),(400002),(400003),(400004),(400005),(400006),(400007),(400008),(400009),(400010),(400011),(400012),(400013),(400014),(400015),(400016),(400017),(400018),(400019),(400020),(400021),(400022),(400023),(400024),(400025),(400026),(400027),(400028),(400029),(400030),(400031),(400032),(400033),(400034),(400035),(400036),(400037),(400038),(400039),(400040),(400041),(400042),(400043),(400044),(400045),(400046),(400047),(400048),(400049),(400050),(400051),(400052),(400053),(400054),(400055),(400056),(400057),(400058),(400059),(400060),(400061),(400062),(400063),(400064),(400065),(400066),(400067),(400068),(400069),(400070),(400071),(400072),(400073),(400074),(400075),(400076),(400077),(400078),(400079),(400080),(00081),(400082),(400083),(400084),(400085),(400086),(400087),(400088),(400089),(400090),(400091),(400092),(400093),(400094),(400095),(400096),(400097),(400098),(400099),(400100),(400101),(400102),(400103),(400104),(400601),(400602),(400603),(400604),(400605),(400606),(400607),(400608),(400609),(400610),(400611),(400612),(400613),(400614),(400701),(400702),(400703),(400704),(400705),(400706),(400707),(400708),(400709),(400710),(401101),(401104),(401105),(401107),(401201),(401202),(401203),(401207),(401209),(401301),(401303),(421001),(421002),(421003),(421004),(421005),(421201),(421202),(421203),(421204),(421301),(421304),(421306)
    
    DECLARE @minValue INT
    SET @minValue = (SELECT MIN (value) FROM @table)
    
    DECLARE @valueToTest INT
    SET @valueToTest = 200
    
    PRINT CASE WHEN @valueToTest < @minValue THEN 'below range'
               ELSE 'NOT below range'
          END
    

    【讨论】:

    • codeomnitrix 假设我的范围为 400001 - 400104 、 400601 - 400614 和 421001 - 421005 如果我使用 IN 功能,那么我必须编写从 400001 到 400104 的 pin 码,而不是意味着我必须手动编写 100密码是不是很容易在不使用 IN 函数的情况下找到下面给出的范围内的数据
    • nunes7452 我只想找到下面提到的范围内的所有数据,即使我得到了正确的输出,我也使用了 IN 函数,但是写 100 个密码是很乏味的。所以我需要简单的方法来解决上述问题
    • 问题被标记为 [oracle],因此此语法无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多