Oracle: запрос, который подсчитывает события всех не буквенно -цифровых символов в строке

StackOverflow https://stackoverflow.com/questions/4831362

Вопрос

Что было бы лучшим способом подсчитать события всех не буквенно -цифровых символов, которые появляются в строке в столбце базы данных 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top