sql >> Databáze >  >> RDS >> Oracle

Vyhledejte, zda je číslo obsaženo ve výrazu jako:1-3,5,10-15,20

To vše je možné provést v SQL pomocí funkce REGEXP_SUBSTR a hierarchických dotazů:

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

Musím však zdůraznit, že správná normalizace databáze je správná cesta. Toto řešení se nemusí dobře škálovat a dělá nesmírně zbytečné množství práce.

Funguje to takto:

Nejprve rozdělte data na čárku:

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

Dále jej rozdělte na pomlčku, abyste zajistili minimální a maximální los, který lze použít v BETWEEN, než jej definitivně připojíte ke stolu. NVL je zde proto, aby zajistila, že vždy existuje 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>

Zde je funkční SQL Fiddle s úplným dotazem.



  1. Chyba SQL Oracle LEFT JOIN a SUBQUERY:ORA-00905:chybějící klíčové slovo

  2. ekvivalent `show create table` v Oracle SQL

  3. Jak mohu vyřešit nekompatibilitu s sql_mode=only_full_group_by v laravel eloquent?

  4. PostgreSQL privilegia a správa uživatelů – co byste měli vědět