首页 > 解决方案 > 不是 regexp_like,查找空值

问题描述

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

'^.{1,10}$'

要返回任何为空且字段太长的字段,它不会,不返回空字段。

是否有一个正则表达式模式可以做到这一点?

例子:

    select col
                from (select null col from dual
                            union all
                            select 'A string' from dual)
            where not regexp_like(col, '^.{1,10}$')

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

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

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

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

谢谢

鲍勃

标签: oracleoracle-apex-5.1

解决方案


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

WHERE REGEXP_LIKE( NULL, '.' )

将返回NULL而不是TRUEor FALSE

将表达式取反为:

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

推荐阅读