Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Suchen Sie, wenn die Zahl in einem Ausdruck enthalten ist wie:1-3,5,10-15,20

Es ist möglich, dies alles in SQL zu tun, indem die REGEXP_SUBSTR-Funktion und hierarchische Abfragen verwendet werden:

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

Ich muss jedoch betonen, dass die richtige Normalisierung Ihrer Datenbank der richtige Weg ist. Diese Lösung lässt sich möglicherweise nicht gut skalieren und macht einen enorm unnötigen Arbeitsaufwand.

So funktioniert es:

Trennen Sie zuerst Ihre Daten am Komma:

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

Teilen Sie es als Nächstes am Bindestrich, um ein minimales und maximales Lot bereitzustellen, das im ZWISCHEN verwendet werden kann, bevor Sie es schließlich mit dem Tisch verbinden. Die NVL sorgt dafür, dass es immer ein Maximum gibt.

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>

Hier ist eine funktionierende SQL Fiddle mit der vollständigen Abfrage.