INSTR / SUBTR在Oracle SQL中过滤字符串

时间:2014-06-02 15:51:32

标签: sql database string oracle substring

我有一个字符串,显示为:

00012345678 Rain, Kip   

我想过滤掉第一个数字/整数,然后重新排列名字和姓氏。

Kip Rain

我原以为我可以使用INSTR({string},',','1')来获取第一个逗号,但我不确定如何在一行中同时执行数字和标点符号。我是否必须将INSTR链接起来?

感谢您的帮助!

3 个答案:

答案 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)