【问题标题】:adding a pipe seperator between characters with Oracle SQL使用 Oracle SQL 在字符之间添加管道分隔符
【发布时间】:2017-01-14 01:27:57
【问题描述】:

我有一个像 'foobar' 这样的字符串,我需要它是 'f | ○ | ○ |乙 |一个 | r' 在查询中(Oracle 12 SQL)。那是每个字母之间的“|”,但不是结尾。字符串长度不同,可能为空。

更多示例:

'foo'>'f | ○ | o'

NULL> ''

我尝试过使用 regexp_replace

select regexp_replace(foobar,'.',' | ') from dual

还有很多其他的组合。我找到了似乎在 Oracle 中不起作用的正则表达式示例,例如 (?

非常感谢任何帮助

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    regexp_replace

    会做的:

    select regexp_replace('foobar','(.)','\1 | ') from dual
    

    会给你

    f | o | o | b | a | r | 
    

    摆脱最后一个小节的简单方法(编辑,遗漏空格):

    select substr(regexp_replace('foobar','(.)','\1 | '),1, length('foobar')*4-3) from dual
    

    输出

    f | o | o | b | a | r
    

    概念证明(只是为了满足 Raj_te 我真的看不出有什么问题)

    with t as 
    (
    select 1 as id, 'foobar' as field1 from dual union all
    select 2 as id, 'fooobar' as field1 from dual union all
    select 3 as id, 'foooobar' as field1 from dual union all
    select 4 as id, 'fooooobar' as field1 from dual union all
    select 5 as id, 'foooooobar' as field1 from dual union all
    select 6 as id, 'fooooooobar' as field1 from dual union all
    select 7 as id, 'foooooooobar' as field1 from dual )
    select substr(regexp_replace(field1,'(.)','\1 | '),1, length(field1)*4-3) 
     from t
     order by id;
    

    输出

    f | o | o | b | a | r
    f | o | o | o | b | a | r
    f | o | o | o | o | b | a | r
    f | o | o | o | o | o | b | a | r
    f | o | o | o | o | o | o | b | a | r
    f | o | o | o | o | o | o | o | b | a | r
    f | o | o | o | o | o | o | o | o | b | a | r
    

    【讨论】:

    • 为什么投反对票?是不是有什么问题?建设性的批评总是受欢迎的。 ;)
    • 很多很好的答案,但这个最适合我的实际情况。
    • @vercelli 答案可能更清晰,为什么在可以使用 RTRIM 时使用 SUBSTR?还有两个地方的“foobar”?
    • 无知的人联合起来说坏话是正确的答案。万岁!
    • @mathguy 批评总是好的,但如果你投反对票,你应该解释原因。感谢您的支持;)
    【解决方案2】:

    问题是你需要一个反向引用来获得你的角色。然后另一个问题是表达式末尾的|。这是一种方法:

    select regexp_replace(regexp_replace(foobar, '(.)', '\1 |'), ' \| ', '')
    

    或者,也许更简单:

    select substr(regexp_replace(foobar, '(.)', ' | \1'), 4)
    

    【讨论】:

    • 这行不通 Gordon...您有点着急忘记了 foobar 周围的单引号..!!!拇指规则..在您测试时发布..无论您有多少声誉..!!!
    • @Raj_Te 。 . . OP的问题在foobar周围没有单引号,表明它是一个列。
    • 第一行说“我有一个像'foobar'这样的字符串”..所以它不能是一个列..
    • 对我来说有点模棱两可!
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2012-02-19
    • 2017-02-24
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多