如何在克隆数据库存储过程中紧凑检查变量中的多个字符串?
问题
我正在编写克隆数据库的存储过程,需要检查database_name变量中是否包含指定字符串。目前的实现代码如下:
IF ((CONTAINS(:database_name, 'STRING1'))=TRUE) THEN RAISE clone_exception; END IF; IF ((CONTAINS(:database_name, 'STRING2'))=TRUE) THEN RAISE clone_exception; END IF; IF ((CONTAINS(:database_name, 'STRING3'))=TRUE) THEN RAISE clone_exception; END IF;
我不想编写3个独立的CONTAINS检查块,希望代码更简洁紧凑,能否将这3个字符串检查合并到同一个代码块中?我曾尝试使用IN运算符,但找到的示例均基于表查询,而我仅需对变量进行比较,因此无法参考。
回答
有几种方法可以简化你的代码:
合并
CONTAINS条件:直接用OR运算符把三个检查合并到同一个IF语句中,逻辑和原代码完全一致,但更紧凑:IF CONTAINS(:database_name, 'STRING1') OR CONTAINS(:database_name, 'STRING2') OR CONTAINS(:database_name, 'STRING3') THEN RAISE clone_exception; END IF;注:可以省略
=TRUE的判断,因为CONTAINS本身返回布尔值,直接作为条件即可。使用正则表达式匹配:如果你的数据库支持正则函数(如Oracle的
REGEXP_LIKE),可以用正则的多选项匹配进一步简化:IF REGEXP_LIKE(:database_name, 'STRING1|STRING2|STRING3') THEN RAISE clone_exception; END IF;竖线
|表示“或”,只要变量包含其中任意一个字符串就会触发异常。用基础字符串函数替代
CONTAINS:如果不需要全文索引的高级功能,用INSTR(多数数据库支持)做简单包含检查更轻量,合并写法如下:IF INSTR(:database_name, 'STRING1') > 0 OR INSTR(:database_name, 'STRING2') > 0 OR INSTR(:database_name, 'STRING3') > 0 THEN RAISE clone_exception; END IF;
内容的提问来源于stack exchange,提问作者Justine
相关产品推荐
相关产品推荐

