我有一个字符串,显示为:
00012345678 Rain, Kip
我想过滤掉第一个数字/整数,然后重新排列名字和姓氏。
Kip Rain
我原以为我可以使用INSTR({string},',','1')来获取第一个逗号,但我不确定如何在一行中同时执行数字和标点符号。我是否必须将INSTR链接起来?
感谢您的帮助!
答案 0 :(得分:1)
你可以链接他们;但是对于复杂的事情,很快就会弄清楚正在发生的事情。除非您有明显的性能问题,否则使用正则表达式通常会更快。在这种情况下,使用REGEXP_REPLACE()
select regexp_replace(your_string
, '[^[:alpha:]]+([[:alpha:]]+)[^[:alpha:]]+([[:alpha:]]+)'
, '\2 \1')
from ...
第二个参数是匹配字符串;在这种情况下,我们将搜索所有非字母字符([^[:alpha:]]
)1次或更多次(+
),然后按字母字符([[:alpha:]]
)1次或更多次。重复这一点以考虑空格和逗号;并将匹配您的字符串,如下所示:
|string | matched by | +--------------+----------------+ |'00012345678 '| [^[:alpha:]]+ | |'Rain' | ([[:alpha:]]+) | |', ' | [^[:alpha:]]+ | |'Kip' | ([[:alpha:]]+) |
这里的括号代表组;第一组是第一组等......
REGEXP_REPLACE()
的第三个参数告诉Oracle用什么来替换你的字符串;组进入的地方 - 您可以按任何顺序替换组。在这个例子中,我想要第二组(Kip
),后跟一个空格,然后是第一组(Rain
)。
您可以在this SQL Fiddle
中看到这一切答案 1 :(得分:0)
是的,可以链接它们:
substr(str, 1, instr(str, ' ')) number_part
substr(str, instr(str, ' '), instr(str, ',') - instr(str, ' ')) Kip
substr(str, instr(str, ' ', 2), len(str)) Rain
在上一个示例中,如果字符串较长,则可以使用比len(str)更优先的内容。
答案 2 :(得分:0)
我偏向于使用substr函数的正则表达式变体。
首先获取非数字字符的重复列表,如下所示:
REGEXP_SUBSTR('00012345678 Rain, Kip','([[:alpha:]]|[-])+',1,1)
其中[[:alpha:]]是包含所有字母字符的字符类。 括号中的表达式[ - ]只是一个匹配列表,这是我确定姓氏Rain可能包含连字符的方式。交替运算符' |'表示字母或连字符是可接受的。 ' +'表示我们希望匹配一个或多个匹配项。
其次,获取字符串末尾的最后一个非数字字符:
REGEXP_SUBSTR('00012345678 Rain, Kip','[^, ]+$',1,1)
在这里,我将到达字符串的末尾(使用锚点,' $'),并在逗号和空格后面找到所有字符。
接下来,我使用连接符运算符||。
组合(使用其间的空格)REGEXP_SUBSTR('00012345678 Rain, Kip','[^, ]+$',1,1) ||' ' || REGEXP_SUBSTR('00012345678 Rain, Kip','([[:alpha:]]|[ -])+',1,1)