Oracle: запрос, который подсчитывает события всех не буквенно -цифровых символов в строке
-
27-10-2019 - |
Вопрос
Что было бы лучшим способом подсчитать события всех не буквенно -цифровых символов, которые появляются в строке в столбце базы данных Oracle.
При попытке найти решение, я понял, что у меня есть запрос, который не был связан с проблемой, но я заметил, что могу изменить его в надежде решить эту проблему. Я придумал это:
SELECT COUNT (*), SUBSTR(TITLE, REGEXP_INSTR(UPPER(TITLE), '[^A-Z,^0-9]'), 1)
FROM TABLE_NAME
WHERE REGEXP_LIKE(UPPER(TITLE), '[^A-Z,^0-9]')
GROUP BY SUBSTR(TITLE, REGEXP_INSTR(UPPER(TITLE), '[^A-Z,^0-9]'), 1)
ORDER BY COUNT(*) DESC;
Это работает, чтобы найти первый неял -цифровой символ, но я хотел бы сосчитать происшествия по всей строке, а не только первое событие. E. G. В настоящее время мой запрос, анализирующий «a (String)», найдет одну открытую скобку, но мне нужно, чтобы он найти одну открытую скобку и одну закрытую скобку.
Решение
Лучший вариант, как вы обнаружили, - это использовать процедуру PL/SQL. Я не думаю, что есть какой -либо способ создать выражение корпорации, которое вернет несколько подсчетов, как вы ожидаете (по крайней мере, не в Oracle).
Один из способов обойти это - использовать рекурсивный запрос для изучения каждого символа индивидуально, который можно использовать для возврата строки для каждого найденного персонажа. Следующий пример будет работать для одной строки:
with d as (
select '(1(2)3)' as str_value
from dual)
select char_value, count(*)
from (select substr(str_value,level,1) as char_value
from d
connect by level <= length(str_value))
where regexp_instr(upper(char_value), '[^A-Z,^0-9]'), 1) <> 0
group by char_value;
Другие советы
Существует неясная функция перевода Oracle, которая позволит вам сделать это вместо regexp:
select a.*,
length(translate(lower(title),'.0123456789abcdefghijklmnopqrstuvwxyz','.'))
from table_name a
Попробуй это:
SELECT a.*, LENGTH(REGEXP_REPLACE(TITLE, '[^a-zA-Z0-9]'), '')
FROM TABLE_NAME a