SET SERVEROUTPUT ON
DECLARE
v_version_string := '2016.0.1|2016.0.2|2016.1|2016.0.4';
v_version := '2016';
BEGIN
IF (INSTR(v_version_string, v_version) > 0) THEN
DBMS_OUTPUT.PUT_LINE('Found');
ELSE
DBMS_OUTPUT.PUT_LINE('Not found');
END IF;
END;
以上返回“Found”,这是正确的。但是,我想要进行完全匹配。如果v_version是2016,我希望它在由|分隔的v_version_string中返回“Not found”。有没有更容易/更快的方法来做到这一点,而不用v_version_string分割进入数组并循环遍历数组?如果v_version是2016.0.1,那么它应该说“Found”,它将在上面的脚本中。但是,它应该说2016年“未找到”.RegEx?
提前致谢。
答案 0 :(得分:1)
您需要使用REGEXP_INSTR函数。
答案 1 :(得分:1)
作为正则表达式的替代方法,您可以将分隔符添加到列表字符串的开头和结尾(因此它变为'|2016.0.1|2016.0.2|2016.1|2016.0.4|'
),并添加到搜索字符串(因此它变为'|2016|'
) 。然后,普通instr
只匹配整个搜索字符串:
IF (INSTR('|'||v_version_string||'|', '|'||v_version||'|') > 0) THEN
DBMS_OUTPUT.PUT_LINE('Found');
ELSE
DBMS_OUTPUT.PUT_LINE('Not found');
END IF;
如果v_version_string
和/或v_version
值有时可以包含前导和尾随分隔符,则可以在重新添加前删除它们(如果它们在那里):
IF (INSTR('|'|| TRIM('|' from v_version_string) ||'|',
'|'|| TRIM('|' from v_version) ||'|') > 0) THEN
这会找到匹配v_version
设置为'2016.0.1'
或'|2016.0.1|'
等。
如果您确实想使用正则表达式,可以在搜索值周围查找分隔符(或开头/结尾):
IF (REGEXP_INSTR(v_version_string, '(^|\|)'||v_version||'(\||$)') > 0) THEN
DBMS_OUTPUT.PUT_LINE('Found');
ELSE
DBMS_OUTPUT.PUT_LINE('Not found');
END IF;
如果有必要,你可以修剪v_version
;你不需要修剪v_version_string
。但我认为这种方式稍微不那么直观,而且对于大量数据而言可能效率较低。