Oracle 處理「逗號分隔多值參數」查詢、動態條件構建、字串分列等常見需求,本文提供實用 SQL 模式與 Java 端參數組裝對應方案。
CREATE OR REPLACE FUNCTION f_get_param(
in_param IN VARCHAR2,
in_flag IN VARCHAR2
) RETURN VARCHAR2 IS
result VARCHAR2(500);
v_len NUMBER;
v_left NUMBER;
v_right NUMBER;
v_param VARCHAR2(200);
BEGIN
result := '';
v_param := in_param;
v_len := LENGTH(v_param);
v_left := INSTR(v_param, in_flag);
IF v_left > 0 THEN
v_param := SUBSTR(v_param, v_left, v_len - v_left + 1);
v_left := INSTR(v_param, ':') + 1;
v_right := INSTR(v_param, '$');
result := SUBSTR(v_param, v_left, v_right - v_left);
END IF;
RETURN result;
EXCEPTION WHEN OTHERS THEN RETURN '';
END;
用法:f_get_param(v_param, 'materialtype:') 解析 materialtype:value$ 格式。
public String buildParams(ListArgs args) {
String params = "$";
if (args != null && !StringUtils.isEmpty(args.getMaterialType())) {
params += "materialtype:" + args.getMaterialType() + "$";
}
return params;
}
-- 單值存在性檢查
SELECT INSTR(',' || '1,2,3,21' || ',', ',' || '1' || ',') FROM DUAL; -- 返回 > 0 表示存在
-- 表查詢:list_id 為逗號分隔字串欄位
SELECT * FROM table_name
WHERE INSTR(',' || list_id || ',', ',' || :id || ',') > 0;
SELECT DISTINCT REGEXP_SUBSTR('a,b,c', '[^,]+', 1, ROWNUM) AS val
FROM DUAL
CONNECT BY ROWNUM <= LENGTH('a,b,c') - LENGTH(REPLACE('a,b,c', ',')) + 1;
結果:a, b, c 三列。
-- 想法:將多條件轉為臨時表或集合,再 JOIN -- 或使用 SYS.ODCIVARCHAR2LIST 集合類型 SELECT * FROM target_table t WHERE EXISTS ( SELECT 1 FROM TABLE(CAST(:id_list AS SYS.ODCIVARCHAR2LIST)) v WHERE v.COLUMN_VALUE = t.id );
INSTR、LIKE 導致全表掃描,適合小表或低頻查詢REGEXP_SUBSTR 正則解析有 CPU 開銷,批次處理考慮 PL/SQL 迴圈選擇正確模式取決於資料量、頻率與維護成本權衡。