不是regexp_like,找到空值

时间:2018-05-31 13:36:24

标签: oracle oracle-apex-5.1

在加载到主系统表之前,对登台表中的输入数据进行数据检查。因为我想在Apex中使用相同的字段检查,所以我使用'not regexp_like'将检查作为正则表达式实现,以返回与其模式不匹配的任何字段。但是,对于强制性的10个字符字段,我期望一个模式,例如:

'^。{1,10} $'

返回任何字段为null且字段太长的字段,但不返回空字段。

是否有可以执行此操作的正则表达式模式?

示例:

/**
 * Returns the name of this enum constant, exactly as declared in its
 * enum declaration.
 *
 * <b>Most programmers should use the {@link #toString} method in
 * preference to this one, as the toString method may return
 * a more user-friendly name.</b>  This method is designed primarily for
 * use in specialized situations where correctness depends on getting the
 * exact name, which will not vary from release to release.
 *
 * @return the name of this enum constant
 */

删除'not'会按预期返回1行...

这里的要点是强制模式找到null,而不是使用regexp_like来查找好的值然后将它们排除,或者在字段上使用NVL。这种检查已经足够昂贵了!

我假设,像大多数涉及null的Oracle代码一样,这里发生的是regexp_like看到null并因此返回null?

Java脚本和Java的行为方式是否相同?

由于

鲍勃

2 个答案:

答案 0 :(得分:1)

如果您只需要使用零个或多个10个字符的字符串,您只需使用:

length(col) > 10 or col is null

关于NULL,您唯一可以依赖的检查是is [not] null

例如:

select length(null) from dual

提供NULL,而不是0

答案 1 :(得分:1)

Oracle在布尔表达式的结果中有3个状态:TRUEFALSENULL(未知)。

WHERE REGEXP_LIKE( NULL, '.' )

将返回NULL而不是TRUEFALSE

将表达式否定为:

WHERE NOT REGEXP_LIKE( NULL, '.' )

还会返回NULL而不是TRUEFALSE,因为它不是TRUE,所以永远不会返回该行。

相反,您需要明确检查NULL值:

WHERE NOT REGEXP_LIKE( col, '^.{1,10}$' )
OR    col IS NULL

或更简单地说:

WHERE LENGTH( col ) > 10
OR    col IS NULL