Oracle场景模式匹配和指定字符提取

kuuvgm7e  于 2023-06-05  发布在  Oracle
关注(0)|答案(1)|浏览(346)

我有一个长文本字段。
| 色谱柱A| B柱|
| - -----|- -----|
| S101|从前有一个穷孩子,他整天挨家挨户地卖报纸来交学费。有一天,当他走在路上时,他开始感到虚弱无力。这个可怜的男孩饿坏了,所以他决定来到隔壁时要点吃的。这个可怜的男孩每次都要吃的,但都被拒绝了,直到他走到一个女孩的门前。他要了一杯水,但看到他可怜的状态,女孩回来了一杯牛奶。男孩问他欠她多少牛奶钱,但她拒绝付款。几年后,这个已经长大成人的女孩病倒了。她找了一个又一个医生,但没有人能治好她的病。最后,她去找了城里最好的医生。医生花了几个月的时间治疗她,直到她终于痊愈。尽管她很高兴,但她担心她付不起账单。但是,当医院把账单递给她时,上面写着:“全额支付,一杯牛奶。”|
| | |
| S102|从前有个国王叫迈达斯,他为一个萨梯做了件好事。然后酒神狄俄尼索斯满足了他的一个愿望。迈达斯为了他的愿望,要求他触摸的任何东西都会变成金子。尽管狄俄尼索斯极力阻止,迈达斯还是辩解说这是一个梦幻般的愿望,于是,他实现了这个愿望。迈达斯对他新获得的力量感到兴奋,他开始触摸各种各样的东西,把每一件东西都变成纯金。|
每次显示单词“sentence”时,我们会将单词“sentence”的数据修剪为50个字符。
有多个记录,s101、s102、s103等。下面是我正在寻找的输出
输出:
| 色谱柱A| B柱|
| - -----|- -----|
| S101|从前有一个贫穷的男孩,他的一生都是这样度过的:那个可怜的男孩要食物,却被拒绝了多年以后,那个女孩,现在已经是一个女孩了医生花了几个月的时间治疗她|
| S102|从前有一个国王叫迈达斯,他的名字叫迈达斯。为了他的愿望,迈达斯问:为自己新获得的超能力而兴奋不已|

ui7jx7zq

ui7jx7zq1#

应用数字(1,2,3,4...),次数与单词 * 句子 * 在字符串中出现的次数相同。取所有50个字符的子字符串。使用listagg合并它们:

select columna, 
       listagg(sentence, '  ') within group (order by pos) sentences
from (
  select columna, pos, 
         substr(columnb, instr(columnb, 'Sentence', 1, pos), 50) sentence 
  from my_table 
  cross apply (
    select level pos from dual 
    connect by level <= regexp_count(columnb, 'Sentence') ) )
group by columna

dbfiddle
编辑:

  • 似乎交叉应用在sql developer上不起作用 *

它不是SQL Developer,你有旧版本的Oracle,在这种情况下,你可以连接数据。在Oracle 11g中测试,我可以访问的最低版本:

with 
  mxc as (select max(regexp_count(columnb, 'Sentence')) cnt from my_table),
  rws as (select level pos from mxc connect by level <= cnt)
select columna, 
       listagg(sentence, '  ') within group (order by pos) sentences
from (
  select columna, pos, 
         substr(columnb, instr(columnb, 'Sentence', 1, pos), 50) sentence 
  from my_table 
  left join rws on instr(columnb, 'Sentence', 1, pos) <> 0 )
group by columna

dbfiddle

相关问题