2017-02-09 63 views
2

我想查詢所有的數據庫配置文件我有SESSIONS_PER_USER> 40 我使用的測試數據如下所有的數據庫配置文件:Oracle數據庫查詢與SESSIONS_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:無效的數字,因爲您無法對字符串執行數學運算。

所以,我想這一點:

 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; 

我仍然得到即使第二查詢有過濾默認的和無限的人無效號碼。

對於就不會存在這個問題,因爲該列將被限制在要麼完全數字或字符串,但使用這個數據庫設置我顯然不能改變任何這一點,並在生產系統上的默認值和無限的大部分東西在實踐中使用。

回答

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()只發生在善意整數。

+0

優秀的解決方案。確切需要什麼。感謝您包括如何和爲什麼。 –