sql >> Databasteknik >  >> RDS >> Oracle

Sök om nummer finns i ett uttryck som:1-3,5,10-15,20

Det är möjligt att göra allt detta i SQL genom att använda REGEXP_SUBSTR-funktionen och hierarkiska frågor:

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

Jag måste dock betona att normalisering av din databas korrekt är vägen att gå. Den här lösningen kanske inte skalas bra och gör ett enormt onödigt arbete.

Det fungerar så här:

Dela först din data med kommatecken:

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

Dela sedan upp det på bindestrecket för att ge ett minimum och ett maximum att använda i MELLAN innan du slutligen ansluter det till bordet. NVL är till för att säkerställa att det alltid finns ett maximum.

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>

Här är en fungerande SQL Fiddle med hela frågan.



  1. Skala ut Moodle-databasen

  2. Hur current_timestamp() fungerar i PostgreSQL

  3. Skapa en app för Django Movie Recommendation med Jaccard Index

  4. Gruppera rader med hjälp av grupp efter klausul i MySQL