sql >> Database >  >> RDS >> Oracle

Zoek of getal is opgenomen in een uitdrukking zoals:1-3,5,10-15,20

Het is mogelijk om dit allemaal in SQL te doen door gebruik te maken van de REGEXP_SUBSTR functie en hiërarchische queries:

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

Ik moet echter benadrukken dat het correct normaliseren van uw database de juiste keuze is. Deze oplossing schaalt mogelijk niet goed en doet een enorm onnodige hoeveelheid werk.

Het werkt als volgt:

Splits eerst uw gegevens op de 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

Splits het vervolgens op het koppelteken om een ​​minimale en maximale hoeveelheid te geven om te gebruiken in de TUSSEN voordat u het uiteindelijk aan de tafel toevoegt. De NVL is er om te zorgen dat er altijd een maximum is.

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 is een werkende SQL Fiddle met de volledige query.



  1. LEFT() vs SET TEXTSIZE in SQL Server:wat is het verschil?

  2. Controleer de ruimte die wordt gebruikt door een tabel in SQL Server

  3. Omvang van tijdelijke tabellen in SQL Server

  4. Islands T-SQL-uitdaging