Как использовать операторы LIKE и IN в одном запросе? - PullRequest
4 голосов
/ 29 ноября 2011

Мое простое заявление sql таково:

SELECT USERNAME FROM ALL_USERS;

Но я хочу отфильтровать пользователей системы по результату.Я искал, но не мог найти ничего, что предоставил Oracle;поэтому я попробовал подобное утверждение, и оно не работает:

select username from all_users where username not like '%SH%' 
    or username not like '%SYS%' 
    or username not in ('ANONYMOUS',            
                        'DBSNMP',
                        'MGMT_VIEW',
                        'ORDPLUGINS',
                        'OUTLN',
                        'SI_INFORMATION_SCHEMA',
                        'WK_TEST',
                        'WKPROXY',
                        'XDB'); 

Это не работает.Как мне изменить запрос для получения желаемого результата или, возможно, что-то, что предоставляет oracle для получения предопределенных системных учетных записей?

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Небольшой поворот в других ответах: не (A или B или C) = не A и не B и не C, так что вы, вероятно, изначально хотели:

select username from all_users 
where not (username like '%SH%' 
           or username like '%SYS%' 
           or username in ('ANONYMOUS',            
                        'DBSNMP',
                        'MGMT_VIEW',
                        'ORDPLUGINS',
                        'OUTLN',
                        'SI_INFORMATION_SCHEMA',
                        'WK_TEST',
                        'WKPROXY',
                        'XDB')
           ); 
4 голосов
/ 29 ноября 2011

Вместо OR вам нужно будет использовать AND

select username from all_users where username not like '%SH%' 
  AND username not like '%SYS%' 
  AND username not in ('ANONYMOUS',            
                    'DBSNMP',
                    'MGMT_VIEW',
                    'ORDPLUGINS',
                    'OUTLN',
                    'SI_INFORMATION_SCHEMA',
                    'WK_TEST',
                    'WKPROXY',
                    'XDB'); 

Однако это также отфильтрует законных несистемных пользователей, чьи имена содержат SYS или заканчиваются на SH. Пользователь JOSH будет потерян.

2 голосов
/ 29 ноября 2011

замените or на AND, думаю, он начнет работать.

Однако лучшим подходом может быть наличие флага, указывающего, является ли он системным пользователем или нет. Более сложный подход может состоять в том, чтобы иметь отдельную таблицу для прав, которая будет иметь отношение многие ко многим с таблицей пользователя.

0 голосов
/ 29 ноября 2011

Вы можете попробовать это:

 select username from all_users where username not like '%SH%' 
        AND username not like '%SYS%'
    INTERSECT 
    select username from all_users where username not in ('ANONYMOUS',            
                            'DBSNMP',
                            'MGMT_VIEW',
                            'ORDPLUGINS',
                            'OUTLN',
                            'SI_INFORMATION_SCHEMA',
                            'WK_TEST',
                            'WKPROXY',
                            'XDB'); 
...