Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tìm kiếm nếu số được chứa trong một biểu thức như:1-3,5,10-15,20

Có thể thực hiện tất cả điều này trong SQL bằng cách sử dụng hàm REGEXP_SUBSTR và các truy vấn phân cấp:

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

Tuy nhiên, tôi phải nhấn mạnh rằng chuẩn hóa cơ sở dữ liệu của bạn đúng cách là cách nên làm. Giải pháp này có thể mở rộng quy mô không tốt và thực hiện một lượng công việc cực kỳ không cần thiết.

Nó hoạt động như thế này:

Trước tiên, hãy tách dữ liệu của bạn trên dấu phẩy:

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

Tiếp theo, chia nó trên dấu gạch nối để cung cấp số lượng tối thiểu và tối đa để sử dụng trong GIỮA trước khi cuối cùng nhập nó vào bảng. NVL ở đó để đảm bảo rằng luôn có mức tối đa.

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>

Đây là SQL Fiddle đang hoạt động với truy vấn đầy đủ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách đặt hơn 1000 giá trị vào mệnh đề Oracle IN

  2. Sử dụng PL / SQL làm cách nào để tôi đưa nội dung của tệp vào một đốm màu?

  3. Hàm TO_DSINTERVAL () trong Oracle

  4. Cách tiếp tục xử lý vòng lặp con trỏ sau ngoại lệ trong Oracle

  5. Điền một bảng PL / SQL từ một khối trong các biểu mẫu D2k của Oracle