Gordon_Linoff имеет правильный ответ, но мне нравится играть с общими табличными выражениями (CTE), поэтому я подумал, что добавлю этот дополнительный ответ на случай, если вы захотите указать имена исключений в виде CSV, а не жестко кодировать их вSQL.
WITH
user_table
AS
-- set up some usernames for testing
(SELECT 'ARBY' AS username
FROM DUAL
UNION ALL
SELECT 'CLOSED'
FROM DUAL
UNION ALL
SELECT 'GOOFY'
FROM DUAL),
csv_value
AS
(SELECT 'LOCKED, CLOSED, DEACTIVATED' csv
FROM DUAL),
exclude_uservalues
AS
-- 1) Bracket CSV value with commas
-- 2) Remove any spaces (presumes no embedded spaces within CSV values)
(SELECT ',' || REPLACE (csv, ' ', NULL) || ',' AS csv_values
FROM csv_value),
exclude_userset (
exclude_user, csv_values
)
AS
-- This common table expression will split the CSV values into separate records
-- It works by
-- a) extracting the value between the first two commas
-- b) dropping everything before the second comma
-- c) terminating when there is no second comma
(SELECT SUBSTR (csv_values, 2, INSTR (csv_values, ',', 2) - 2) AS exclude_user
, SUBSTR (csv_values, INSTR (csv_values, ',', 2)) AS csv_values
FROM exclude_uservalues
UNION ALL
SELECT SUBSTR (csv_values, 2, INSTR (csv_values, ',', 2) - 2) AS exclude_user
, SUBSTR (csv_values, INSTR (csv_values, ',', 2)) AS csv_values
FROM exclude_userset
WHERE INSTR (csv_values, ',', 2) > 0)
SELECT username
FROM user_table LEFT OUTER JOIN exclude_userset ON username = exclude_user
WHERE exclude_user IS NULL;
Результат этой чепухи:
USERNAME
--------
GOOFY
ARBY