sql >> Database teknologi >  >> RDS >> Oracle

Søg om tal er indeholdt i et udtryk som:1-3,5,10-15,20

Det er muligt at gøre alt dette i SQL ved brug af REGEXP_SUBSTR-funktionen og hierarkiske forespørgsler:

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

Jeg må dog understrege, at normalisering af din database korrekt er vejen at gå. Denne løsning skalerer muligvis ikke godt og udfører et enormt unødvendigt arbejde.

Det fungerer sådan her:

Del først dine data på kommaet:

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

Dernæst skal du dele den på bindestregen for at give et minimum og maksimum parti til brug i MELLEM, før du endelig slutter det til bordet. NVL er der for at sikre, at der altid er et maksimum.

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>

Her er en fungerende SQL Fiddle med hele forespørgslen.



  1. A Big Deal:SQL Server 2016 Service Pack 1

  2. Brug sammensat primærnøgle som fremmednøgle

  3. Android:onUpgrade kalder ikke ved databaseopgradering

  4. KGXGN polling fejl (15)