Было бы гораздо лучше хранить части col1 в отдельных столбцах. В любом случае, вот еще что, кроме того, что сказал Тило.
Игнорируя часть rownum, четыре строки вашей таблицы соответствуют предложению WHERE в вашем примере. Ваше предложение WHERE на английском языке «имя и код совпадают, иначе они не совпадают, но совпадают имена».
Это сложный способ сказать "совпадение имен", и нет необходимости в таком сложном предложении WHERE, если это действительно то, что вы имеете в виду.
(Если \ s означает пробел, в котором я не уверен, это «имя совпадает, а после имени есть пробел».) Если вы хотите увидеть совпадение «оба» перед совпадением только по имени, выберите первую строку в этом порядке «скоринга»:
ORDER BY
CASE WHEN REGEXP_LIKE(col1, name||'\s+'||code) THEN 2
WHEN REGEXP_LIKE(col1, name||'\s+) THEN 1
ELSE 0 END DESC
Ответ на комментарий:
Ваше предложение WHERE не может выразить НО, если нет, ... аспект вашего требования. Предложение WHERE просто выражает Если в строке есть и CODE, и NAME, или строка, содержащая только NAME, покажите ее , и это не ваше требование.
Чтобы выразить ГДЕ A, НО если не A, то B , это не сработает для записи
WHERE <condition A> OR <condition B>
Вы должны написать
WHERE <condition A> OR (NOT <condition A> AND <condition B>)
или сделайте что-нибудь, как я сделал с моим выражением CASE.
Это помогает?