Игнорировать ответ резервного помощника, он может выглядеть нормально, но имеет несколько проблем:
здесь оба должны быть +1 не -1:
name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' ');
Очень опасно, потому что не сразу видно, если путь не имеет белых пробелов, но замена только «%» оставит вас с пучком по 20 в каждом белом пространстве:
name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' ');
Есть лучшие способы, чем этот цикл для белого пробелы.
Также это вызовет проблемы во время отладки.
Просто используйте два сравнения:
select *
from dept
where loc like '%o%' and loc not like '%o%o%';
Обратите внимание, что Oracle, как правило, чувствителен к регистру, поэтому я бы рекомендовал:
select *
from dept
where lower(loc) like '%o%' and loc not like '%o%o%';
используйте REGEXP_COUNT
select * from department where REGEXP_COUNT(loc,'o',1,'i') = 1; --'i' for case-insensitive
или LENGTH
(вместе с lower()/upper()
сверху, чтобы сделать его нечувствительным к регистру)
select * from department where length(loc) - length(replace(loc,'O')) = 1
Вы можете использовать LENGTH()
для этого
SELECT * FROM department WHERE (LENGTH(loc) - LENGTH(REPLACE(UPPER(loc),'O'))) = 1
Select * from Dept where regexp_count(loc,'O')=1;
Это будет работать
В этом случае мы можем просто использовать INSTR
для поиска числа появления нужного символа / строки, а затем добавить =0
в условие WHERE
для извлечения данных, где второго появления не существует
SELECT DEPTNO, DNAME, LOC
FROM yourtable
WHERE INSTR(LOC, 'O', 1, 2) = 0
OUTPUT:
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
Если вы хотите, чтобы в строке существовало хотя бы один O
, замените условие WHERE
на нижнюю строку
WHERE INSTR(LOC, 'O', 1, 2) = 0 AND INSTR(LOC, 'O', 1, 1) > 0
] OUTPUT:
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
30 SALES CHICAGO