我想使用REGEXP_INSTR
从字符串返回以下位置。
我正在寻找以下字符串中完全匹配的单词 car 。
car,care,oscar - 1
care,car,oscar - 6
oscar,care,car - 12
类似
SELECT REGEXP_INSTR('car,care,oscar', 'car', 1, 1) "REGEXP_INSTR" FROM DUAL;
我不确定使用哪种逃避操作符。
答案 0 :(得分:1)
更简单的解决方案是用逗号包围源字符串和搜索字符串,并使用INSTR查找位置。
SELECT INSTR(',' || 'car,care,oscar' || ',', ',car,') "INSTR" FROM DUAL;
示例:
with x(y) as (
SELECT 'car,care,oscar' from dual union all
SELECT 'care,car,oscar' from dual union all
SELECT 'oscar,care,car' from dual union all
SELECT 'car' from dual union all
SELECT 'cart,care,oscar' from dual
)
select y, ',' || y || ',' , instr(',' || y || ',',',car,')
from x
| Y | ','||Y||',' | INSTR(','||Y||',',',CAR,') |
|-----------------|-------------------|----------------------------|
| car,care,oscar | ,car,care,oscar, | 1 |
| care,car,oscar | ,care,car,oscar, | 6 |
| oscar,care,car | ,oscar,care,car, | 12 |
| car | ,car, | 1 |
| cart,care,oscar | ,cart,care,oscar, | 0 |
答案 1 :(得分:0)
以下查询处理所有方案。如果字符串以car,
开头或整个字符串仅为car
,则返回起始位置。如果找到,car,
,或者字符串以,car
结尾以占用逗号,则返回起始位置+ 1。
SELECT
CASE
WHEN REGEXP_LIKE('car,care,oscar', '^car,|^car$') THEN REGEXP_INSTR('car,care,oscar', '^car,|^car$', 1, 1)
WHEN REGEXP_LIKE('car,care,oscar', ',car,|,car$') THEN REGEXP_INSTR('car,care,oscar', ',car,|,car$', 1, 1)+1
ELSE 0
END "REGEXP_INSTR"
FROM DUAL;
具有各种可能性的
答案 2 :(得分:0)
我喜欢 Noel 他的回答,因为它提供了非常好的表现!另一种方法是从字符分隔的字符串中创建单独的行: pm.nodes = 'a;b;c;d;e;f;g'
(select regexp_substr(pm.nodes,'[^;]+', 1, level)
from dual
connect by regexp_substr(pm.nodes, '[^;]+', 1, level) is not null)