2

我想用 session_per_user > 40 查询我拥有的所有数据库配置文件。我使用的测试数据如下:

   select PROFILE, LIMIT from DBA_PROFILES where resource_name = 'SESSIONS_PER_USER;
   Profile LIMIT
   DEFAULT  UNLIMITED
   ORA_STIG_PROFILE DEFAULT
   APP_USER 40
   TEST2    2
   TEST3    3
   TEST4    11
   TEST5    27
   TEST6    33
   TEST7    244
   TEST8    45
   TEST9    50
   TEST10   111
   TEST11   93
   TEST12   39
   TEST13   41

我从这个查询开始

     select profile, limit from DBA_PROFILES where resource_name = 'SESSIONS_PER_USER' AND LIMIT >= 40;

这导致 ORA-01722: invalid number 因为您无法对字符串执行数学运算。

所以我尝试了这个:

     select profile, LIMIT from (select PROFILE, LIMIT from DBA_PROFILES where resource_name = 'SESSIONS_PER_USER' AND LIMIT != 'UNLIMITED' AND PROFILE != 'DEFAULT' AND LIMIT != 'DEFAULT') WHERE LIMIT = 40;

即使第二个查询过滤了默认和无限制的查询,我仍然收到无效号码。

对于大多数事情,这个问题不会存在,因为该列将被限制为专门的数字或字符串,但是使用此数据库设置我显然无法更改任何内容,并且在生产系统上,默认值和无限制值在实践中使用.

4

1 回答 1

1

正如您所注意到的,问题在于该列包含数字和字符串。

所以,只要你能让它忽略字符串的非数字,你就可以解决这个问题。如您所见,where可能无法解决问题。所以,使用case

select profile, limit
from DBA_PROFILES
where resource_name = 'SESSIONS_PER_USER' AND
      (case when not regexp_like(limit, '[^0-9]') then cast(LIMIT as number)
       end) >= 40;

case保证其子句的执行顺序,因此cast()仅发生在真正的整数上。

于 2017-02-09T21:47:10.687 回答