Sql 对字符及其在字符串中的位置进行计数

Sql 对字符及其在字符串中的位置进行计数,sql,oracle,plsql,Sql,Oracle,Plsql,我有一根像“ABC”的线。我需要找出“#”的位置,然后找出后面有多少个“#”。例如,在这种情况下,输出应该是 position count ======= ====== 1 3 7 2 是否可以在sql语句中执行此操作,或者我们需要在此处使用plsql块?以下是在sql语句中执行此操作的一种方法: WITH sample_data AS (SELECT '###ABC##DE' str FROM dual UNION ALL

我有一根像“ABC”的线。我需要找出“#”的位置,然后找出后面有多少个“#”。例如,在这种情况下,输出应该是

position count
=======  ======
1           3
7           2

是否可以在sql语句中执行此操作,或者我们需要在此处使用plsql块?

以下是在sql语句中执行此操作的一种方法:

WITH sample_data AS (SELECT '###ABC##DE' str FROM dual UNION ALL
                     SELECT 'A#B#C#D#E##' str FROM dual UNION ALL
                     SELECT 'ABCDE' str FROM dual)
SELECT str,
       NVL(length(regexp_substr(str, '#+', 1, LEVEL)), 0) num_hashes,
       regexp_instr(str, '#+', 1, LEVEL) hash_pos
FROM   sample_data
CONNECT BY regexp_substr(str, '#+', 1, LEVEL) IS NOT NULL
AND PRIOR str = str
AND PRIOR sys_guid() IS NOT NULL;

STR         NUM_HASHES   HASH_POS
----------- ---------- ----------
###ABC##DE           3          1
###ABC##DE           2          7
A#B#C#D#E##          1          2
A#B#C#D#E##          1          4
A#B#C#D#E##          1          6
A#B#C#D#E##          1          8
A#B#C#D#E##          2         10
ABCDE                0          0

这样做的目的是使用分层查询(即
connectby
部分)遍历字符串并搜索1个或多个字符。它将为每个组输出一行。

以下是在SQL语句中执行此操作的方法:

WITH sample_data AS (SELECT '###ABC##DE' str FROM dual UNION ALL
                     SELECT 'A#B#C#D#E##' str FROM dual UNION ALL
                     SELECT 'ABCDE' str FROM dual)
SELECT str,
       NVL(length(regexp_substr(str, '#+', 1, LEVEL)), 0) num_hashes,
       regexp_instr(str, '#+', 1, LEVEL) hash_pos
FROM   sample_data
CONNECT BY regexp_substr(str, '#+', 1, LEVEL) IS NOT NULL
AND PRIOR str = str
AND PRIOR sys_guid() IS NOT NULL;

STR         NUM_HASHES   HASH_POS
----------- ---------- ----------
###ABC##DE           3          1
###ABC##DE           2          7
A#B#C#D#E##          1          2
A#B#C#D#E##          1          4
A#B#C#D#E##          1          6
A#B#C#D#E##          1          8
A#B#C#D#E##          2         10
ABCDE                0          0

这样做的目的是使用分层查询(即
connectby
部分)遍历字符串并搜索1个或多个字符。它将为每个组输出一行。

您可以使用脚本将查询结果存储在一个数组中,然后执行事件搜索,以查找要查找的值的每个事件,并返回每个事件所在的索引。您可以使用脚本将查询结果存储在一个数组中,然后对其执行事件搜索查找要查找的值的每个匹配项,并返回每个匹配项所在的索引。。