Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cari jika nomor terkandung dalam ekspresi seperti:1-3,5,10-15,20

Hal ini dimungkinkan untuk melakukan ini semua dalam SQL dengan menggunakan fungsi REGEXP_SUBSTR dan kueri hierarkis:

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

Namun, saya harus menekankan bahwa menormalkan database Anda dengan benar adalah cara yang harus dilakukan. Solusi ini mungkin tidak dapat diskalakan dengan baik dan melakukan pekerjaan yang sangat tidak perlu.

Ini bekerja seperti ini:

Pisahkan dulu data Anda dengan koma:

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

Selanjutnya, pisahkan pada tanda hubung untuk memberikan lot minimum dan maksimum untuk digunakan di ANTARA sebelum akhirnya menggabungkannya ke tabel. NVL ada untuk memastikan bahwa selalu ada 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>

Berikut adalah SQL Fiddle yang berfungsi dengan kueri lengkap.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggabungkan dan mengelompokkan beberapa baris di Oracle

  2. Oracle Cloud:Membuat Database Autonomous Transaction Processing (ATP)

  3. 2 Fungsi yang Mendapatkan Hari, Bulan, dan Tahun dari Tanggal di Oracle

  4. PL/SQL hak istimewa yang tidak mencukupi dalam kueri dimungkinkan secara manual

  5. insert massal dari Java ke Oracle