在第三行之前提取文本-“;破折号;在SQL中

在第三行之前提取文本-“;破折号;在SQL中,sql,oracle,Sql,Oracle,你能帮我获取SQL的代码吗 我有一个列名INFO_01,其中包含如下信息: D10-52247-479-245大厅SO 我只想提取 D10-52247-479 我想要文本中第三个“-”破折号之前的部分。我假设是MySQL,如果我错了,请告诉我。但是,使用以下命令可以执行以下操作: SELECT SUBSTRING_INDEX(column, '-', 3) 编辑 似乎是甲骨文。看来我们可能不得不求助于 无法测试,因此不确定将产生什么样的结果…您需要获取第三个破折号的位置(使用instr),然后

你能帮我获取SQL的代码吗

我有一个列名INFO_01,其中包含如下信息:
D10-52247-479-245大厅SO

我只想提取
D10-52247-479


我想要文本中第三个“-”破折号之前的部分。

我假设是MySQL,如果我错了,请告诉我。但是,使用以下命令可以执行以下操作:

SELECT SUBSTRING_INDEX(column, '-', 3)
编辑 似乎是甲骨文。看来我们可能不得不求助于


无法测试,因此不确定将产生什么样的结果…

您需要获取第三个破折号的位置(使用instr),然后使用substr获取字符串的必要部分

with temp as (
    select 'D10-52247-479-245 HALL SO' test_string from dual)
select test_string,
       instr(test_string,1,3) third_dash,
       substr(test_string,1,instr(test_string,1,3)-1) result
  from temp
);

下面是一个简单的语句,它应该起作用:


从表中选择SUBSTR(列,1,INSTR(列,'-',1,3))

使用SUBSTR和INSTR的组合将返回您想要的:

SELECT SUBSTR('D10-52247-479-245', 0, INSTR('D10-52247-479-245', '-', -1, 1)-1) AS output
  FROM DUAL
结果: 使用: 参考:
补遗
如果使用Oracle10g+,您可以通过使用regex。

Oracle的REGEXP功能受Oracle10g+支持。我完全承认我与Oracle格格不入。如果它奏效,那就是一个奇迹(或者至少是一个体面的方向)。Oracle专家可以随意插话。D10-52247-479-如果它能工作,它会返回什么,因此应该为该帖子实现一个荣誉按钮(或一个准备按钮,以我认为合适的为准)编辑并将其更改为此(忘记我也分组了最后一个连字符):
^((?*-){2}[^-]*)
您好,它返回了D10-52247-479-我只想要D10-52247-479,没有破折号…几乎完成了。如果可能,请帮助完成代码。从表中选择SUBSTR(列,1,INSTR(列,'-',1,3)-1);我相信你可以从这里开始,但这与每次“第三个破折号前的文本”不同。如果这是您的要求,您最好使用instr(..,-',1,3)来精确和准确。
SELECT SUBSTR('D10-52247-479-245', 0, INSTR('D10-52247-479-245', '-', -1, 1)-1) AS output
  FROM DUAL
output
-------------
D10-52247-479
SELECT SUBSTR(t.column, 0, INSTR(t.column, '-', -1, 1)-1) AS output
  FROM YOUR_TABLE t