Không phải là giải pháp thay thế chính xác cho 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" VÀ "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ỏ.