【问题标题】:substr SQl functionsubstr SQl 函数
【发布时间】:2015-06-01 08:50:21
【问题描述】:

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

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' 时,它只解析姓氏中的两个字母。我用空白来识别它。我不明白这里有什么问题。

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

【问题讨论】:

  • 有什么问题!??你想从查询中得到什么?
  • @Farhęg 假设他想提取姓氏并不是一个疯狂的猜测;)
  • @alfasin 我的评论是在对问题进行任何编辑之前
  • @Farhęg 在这种情况下,我很抱歉!我是在天气晴朗之后才到的。
  • @alfasin,没问题,没关系。

标签: sql oracle substring


【解决方案1】:

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

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

【讨论】:

  • 杰克,如果这对你有用。你能接受我的回答吗?
  • 这似乎是最好的答案,我检查了所有来自 hr.employees 的样本(Oracle HR 架构)。但是“Lex De Haan,QA”有些问题;-)
  • 我刚刚更新了 Reg Exp。这也适用于“Lex De Haan,QA”。请参考小提琴。
  • 对我来说看起来不错,已经对你的答案投了赞成票,但我不是原创海报,他是这里的评委;-)
  • 非常感谢,抱歉耽搁了。
【解决方案2】:

您误用了您传递给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

【讨论】:

  • 或者对不起,这仍然对我不起作用。但是 reg_exp 工作完美。
【解决方案3】:

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

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

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

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

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);

检查这个小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2020-06-05
    • 2022-03-28
    • 1970-01-01
    相关资源
    最近更新 更多