Theo như tôi hiểu vấn đề của bạn, bạn cần một phương thức để chấp nhận một chuỗi được phân tách bằng dấu phẩy làm đầu vào, chia nó thành một tập hợp các số nguyên và sau đó so sánh một số (đọc:số nguyên) với các giá trị trong tập hợp này.
Oracle chủ yếu cung cấp ba loại bộ sưu tập - varrays , bảng lồng nhau và mảng liên kết . Tôi sẽ giải thích cách chuyển đổi một chuỗi được phân tách bằng dấu phẩy thành một bảng lồng nhau và sử dụng nó để truy vấn hoặc so sánh.
Đầu tiên, bạn cần xác định một kiểu đối tượng trong lược đồ. Bạn chỉ có thể viết truy vấn bằng kiểu này nếu bạn xác định nó ở cấp giản đồ.
CREATE OR REPLACE TYPE entity_id AS OBJECT (id_val NUMBER(28));
/
CREATE OR REPLACE TYPE entity_id_set IS TABLE OF entity_id;
/
Tiếp theo, xác định một hàm như sau:
FUNCTION comma_to_nt_integer (p_comma_delimited_str IN VARCHAR)
RETURN entity_id_set IS
v_table entity_id_set;
BEGIN
WITH temp AS (SELECT TRIM(BOTH ',' FROM p_comma_delimited_str) AS str FROM DUAL)
SELECT ENTITY_ID(TRIM (REGEXP_SUBSTR (t.str,
'[^,]+',
1,
LEVEL)))
str
BULK COLLECT INTO v_table
FROM temp t
CONNECT BY INSTR (str,
',',
1,
LEVEL - 1) > 0;
RETURN v_table;
END comma_to_nt_integer;
Bạn đã hoàn thành với DDL cần thiết cho nhiệm vụ này. Bây giờ, bạn có thể chỉ cần viết truy vấn của mình dưới dạng:
SELECT *
FROM ..
WHERE ...
AND gfcid in (table(comma_to_nt_integer(GDFCID_STRING)));