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

Thay thế Find_in_set của mysql trong Oracle là gì

Không phải là giải pháp thay thế chính xác cho FIND_IN_SET , nhưng trong trường hợp ví dụ của bạn (nơi bạn chỉ cần biết NẾU một giá trị được chứa trong một tập hợp được phân tách bằng dấu phẩy) REGEX_COUNT với regex '^ ([^,] +,) * your_value (, [^,] +) * $' sẽ phù hợp.

Kiểm tra các truy vấn SQL sau (dành cho Oracle) ...

Ví dụ với số

Tìm kiếm số 1 trong tập hợp: [1,2,3,4,5,6,11,12,13]

SELECT
    CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

Trả về 1 đúng

Tìm kiếm số 1 trong bộ:[111,222,333]. INSTR sẽ không báo cáo tiêu cực trong trường hợp này.

SELECT
    CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

Trả về 0 đúng

Ví dụ với chuỗi

Tìm kiếm 'John' trong một tập hợp các tên:

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Trả về 1 đúng

Nhưng nếu bạn tìm kiếm chữ cái 'a' , nó sẽ trả về 0 một cách chính xác (INSTR sẽ không thành công nữa).

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Trả về 0 đúng

Tôi biết câu hỏi này đã được trả lời từ lâu, nhưng nó xếp hạng tốt trong kết quả tìm kiếm và có thể giúp những người khác tìm kiếm một giải pháp đơn giản nhưng đúng đắn hơn so với INSTR của Oracle chức năng.

Biểu thức Boolean

Cũng có thể sử dụng các biểu thức Boolean, như OR hoặc AND .

Một ví dụ sử dụng OR như sau:

SELECT
    CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Trả về 1 chính xác, vì nó đã tìm thấy "peter" (tìm kiếm "helen" hoặc "peter" ).

Đối với AND cách tiếp cận hơi khác một chút (sửa đổi biểu thức CASE thay vì regex ):

SELECT
    CASE WHEN
            REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
            REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END as cnt
FROM DUAL;

Truy vấn trên tìm kiếm cả "john" "peter" . AND hoạt động có thể được thực hiện dễ dàng bằng cách sao chép REGEXP_COUNT biểu thức trong CASE cú pháp, tuy nhiên đổi lại với một hình phạt hiệu suất nhỏ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chọn chi tiết cơ sở dữ liệu và tên bảng trong iSQL plus

  2. Thiếu biểu thức khi chọn tất cả các cột và một cột khác

  3. Sự khác biệt giữa hai ngày trong sql

  4. Oracle đọc Tệp từ Thư mục với ngoại lệ

  5. Sử dụng TUPLES để đặt hơn 1000 mục nhập trong mệnh đề SQL IN