substr SQl 函数

substr SQl function

我在 table 中解析我的姓氏和名字时遇到问题。我的代码:

SELECT value, 
       substr(value,instr(value,' ',1),instr(value,' ',2)-2) last_name,
  FROM (SELECT 'Matt Ryan, QB' value 
          FROM dual);

如果我写 'Andrew Luck, QB' 它会正确解析姓氏。但是当我写 'Matt Ryan, QB' 时,它只解析姓氏中的两个字母。我用白色space来识别它。我不明白这里有什么问题。

'Matt Ryan, QB'
'Andrew Luck, QB'

您滥用了传递给 instr 的索引参数,而且您应该删除 "last_name" 之后的逗号。尝试:

SELECT value, 
substr(value, instr(value,' ')+1, instr(value,' ',instr(value,' '))-1) last_name
FROM ( 
  SELECT 'Matt Ryan, QB' value FROM dual 
);

Link to fiddle

请考虑使用正则表达式。我认为这应该可以解决您的问题。

SELECT value, 
    REGEXP_SUBSTR(value,
                '\w+\s+(\w+\s+\w+|\w+),',1,1,NULL,1) last_name
    FROM ( 
    SELECT 'Matt Ryan, QB' value FROM dual 
    );

勾选这个fiddle

INSTR的出现参数是第四个参数,所以要用

instr(value,' ', 1, 1) -- first space

instr(value,' ', 1, 2) -- seconds space

SUBSTR的第三个参数是要提取的字符数。这是第二个 space 的位置减去第一个 space 的位置 - 减去一个逗号:

instr(value,' ', 1, 2) -instr(value,' ', 1, 1) -1

总而言之:

SELECT value,
      substr(value, instr(value,' ', 1, 1),
                    instr(value,' ', 1, 2) -instr(value,' ', 1, 1) -1) last_name
 FROM (SELECT 'Matt Ryan, QB' value 
         FROM dual);

检查此 Fiddle here