【问题标题】:Oracle - Get all characters before the nth occurrence of a characterOracle - 在字符第 n 次出现之前获取所有字符
【发布时间】:2017-09-28 08:37:47
【问题描述】:

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

假设我可以有以下字符串:

'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 或正则表达式,但我无法理解这一点。

【问题讨论】:

  • 字符串的长度总是6个吗?
  • 逗号之间的“子字符串”(即 123456)始终是相同数量的字符,因此对于本示例,我们可以使用 6。

标签: sql oracle


【解决方案1】:

INSTR 函数正是您需要找到的第 n 个子字符串的位置 - 请参阅出现参数。

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

例如(将 5 替换为 N 并插入您的列):

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

【讨论】:

  • 谢谢!看来我已经非常接近这个答案了,只是有一些小的差异。
  • 字符串中的位置是 1 索引的,虽然这可行,但您应该使用 SUBSTR( your_column, 1, ...
  • 谢谢!更正了答案。
【解决方案2】:

你可以这样做:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2022-10-13
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多