Выбор наблюдений в диапазоне чисел между множеством других чисел - PullRequest
0 голосов
/ 10 января 2020

В наборе данных есть символьная переменная, которая читается как «2-6» или «4-7». Что меня интересует в выборе тех наблюдений, где числа 3,4,5 могут быть в этом спектре «4-7», то достаточно просто использовать выражение

where 3 between TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE,'\d+',1,1)) and TO_NUMBER(substr(REGEXP_SUBSTR(MEAS_VALUE,'(-)\d+',1,1),2)) or
 4 between TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE,'\d+',1,1)) and TO_NUMBER(substr(REGEXP_SUBSTR(MEAS_VALUE,'(-)\d+',1,1),2)) or 
 5 between TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE,'\d+',1,1)) and TO_NUMBER(substr(REGEXP_SUBSTR(MEAS_VALUE,'(-)\d+',1,1),2))

Просто посмотрите, есть ли более .. красноречивое решение для группировки этого диапазона в данных функционального теста ниже
TIA-

with test (id, MEAS_VALUE) as (
  select 1,'2-5'                   from dual union all --want this
  select 2,'1-2'                from dual union all   --do not want this
  select 3,'5-7'  from dual)   ----want this
  select * from test
  where 3 between TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE,'\d+',1,1)) and TO_NUMBER(substr(REGEXP_SUBSTR(MEAS_VALUE,'(-)\d+',1,1),2)) 
   or 4 between TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE,'\d+',1,1)) and TO_NUMBER(substr(REGEXP_SUBSTR(MEAS_VALUE,'(-)\d+',1,1),2)) or 
     5 between TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE,'\d+',1,1)) and TO_NUMBER(substr(REGEXP_SUBSTR(MEAS_VALUE,'(-)\d+',1,1),2));

1 Ответ

0 голосов
/ 10 января 2020

Используйте подзапрос:

select t.*
from (select t.*,
             TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE, '\d+', 1, 1)) as lo,
             TO_NUMBER(REGEXP_SUBSTR(MEAS_VALUE, '\d+', 1, 2)) as lhi
      from test t
     ) t
where 3 between lo and hi and
      4 between lo and hi and
      5 between lo and hi;

Вы можете еще больше упростить условие до:

where least(3, 4, 5) >= lo and
      greatest(3, 4, 5) <= hi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...