Oracle INSTR找到完全匹配

时间:2016-04-07 16:48:32

标签: oracle

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?

提前致谢。

2 个答案:

答案 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。但我认为这种方式稍微不那么直观,而且对于大量数据而言可能效率较低。