Oracle
 sql >> база данни >  >> RDS >> Oracle

Търсете, ако числото се съдържа в израз като:1-3,5,10-15,20

Възможно е да направите всичко това в SQL чрез използване на функцията REGEXP_SUBSTR и йерархични заявки:

with list_of_ids as (
select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
     , nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
          , regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
  from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
          from dual
       connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
               )
       )
select a.*
  from products a
  join list_of_ids b
    on a.lot between b.lot1 and b.lot2

Трябва обаче да подчертая, че нормализирането на вашата база данни е правилният начин. Това решение може да не се мащабира добре и да върши изключително ненужно количество работа.

Работи така:

Първо разделете данните си на запетая:

SQL>  select regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) as a
  2     from dual
  3  connect by regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) is not null
  4          ;

A
--------------
1-3
5
10-15
20

След това го разделете на тирето, за да осигурите минимална и максимална партида, която да използвате в МЕЖДУНАТА, преди накрая да го присъедините към масата. NVL е там, за да гарантира, че винаги има максимум.

SQL> select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
  2       , nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
  3             , regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
  4    from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
  5            from dual
  6         connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
  7                 )
  8         ;

LOT1           LOT2
-------------- --------------
1              3
5              5
10             15
20             20

SQL>

Ето работеща SQL Fiddle с пълната заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Многоезична поддръжка в 11i/R12

  2. Настройки на Django oracle db

  3. SQL Server:как да имитираме заявката за запазване на oracle с dense_rank?

  4. UTL_FILE.FOPEN() процедурата не приема пътя за директория?

  5. EM 12c Регулиране на праговите стойности