Oracle - 在第n次出现字符

时间:2017-09-28 08:37:47

标签: sql oracle

我正在尝试获取一个查询,我在字符出现之前从字符串中获取所有字符。

说我可以拥有以下字符串:

'123456,123456,123456'
'123456'
'123456,123456,123456,123456,123456,123456'
'123456,123456,123456,123456,123456,123456,123456'

现在我希望我的查询始终在逗号的第5个出现之前返回所有内容,

结果:

'123456,123456,123456'
'123456'
'123456,123456,123456,123456,123456'
'123456,123456,123456,123456,123456'

我一直在尝试使用某些substr或regex,但我无法理解这一点。

2 个答案:

答案 0 :(得分:4)

INSTR函数正是你需要找到第n个子串的位置 - 参见出现参数。

获取字符串的一部分直到此位置使用SUBSTRING。 为避免没有第N个符号的情况,请使用NVL(或COALESCE)。

例如(用N替换5并插入列):

SELECT NVL(
  SUBSTR(YOUR_COLUMN, 1,
    INSTR(YOUR_COLUMN,',',1,5) -1),
  YOUR_COLUMN)
FROM YOUR_TABLE;

答案 1 :(得分:0)

你可以这样做:

define string_value='123456,123456';
select CASE 
            WHEN (length('&string_value') - length(replace('&string_value',',',null))) >=5 
            THEN SUBSTR('&string_value',0,INSTR('&string_value',',',1,5)-1)
            ELSE '&string_value'
        END as output
from dual;

输出:

123456,123456

define string_value='123456,123456,123456,123456,123456,123456';
select CASE 
            WHEN (length('&string_value') - length(replace('&string_value',',',null))) >=5 
            THEN SUBSTR('&string_value',0,INSTR('&string_value',',',1,5)-1)
            ELSE '&string_value'
        END as output
from dual;

输出:

123456,123456,123456,123456,123456

如果逗号之间的字符数不总是相同,这将起作用。