【问题标题】:Get substing of a column in Oracle 11g在 Oracle 11g 中获取列的子字符串
【发布时间】:2017-07-06 21:51:43
【问题描述】:

我有一列有很长的文本,我需要在其中找到一个特定的字符串。

例如: 该列包含:“Hello mi number is C.C. 2313”

我需要提取“C.C. 2313”

我使用的是 Oracle 11g 数据库。

【问题讨论】:

  • 您的字符串中是否有您要搜索的模式?看看REGEXP_SUBSTR
  • 是的,字符串总是以“C.C.”开头或“抄送”或“抄送”
  • 1.是否总会有一个包含 C.C. 的子字符串?或抄送还是抄送?如果没有,期望的结果是什么? 2. 是否总是有一个这样的子串? 3. 如果只有一个这样的子串,你需要提取什么?从该子字符串到输入字符串末尾的所有内容?在您的示例中就是这种情况,但这是一般要求吗?

标签: sql oracle11g


【解决方案1】:

变量分隔符在 Oracle 中很棘手。这是一种方法:

select substr(col, length(regexp_substr(col, '.*(cc|[cC][.][cC][.]')) + 1)

哦,上面删除了分隔符。你想要它,这样更容易:

select regexp_substr(col, 'cc|[cC][.][cC][.].*')

【讨论】:

  • 至少从 Oracle 11.1 开始,您可以使用 regexp_substrmatch_parameter 参数来简化 - 使用 'i' 值进行不区分大小写的匹配。
【解决方案2】:

这应该会有所帮助

  1. 下面是如何使它工作的示例。
  2. 我的建议是在表格上设置一个触发器,将字符串的一部分作为单独的列插入表格中

WITH data AS (SELECT 'Hello mi number is C.C. 2313' column_Value FROM dual UNION SELECT 'Hello mi number is c.c. 2414' column_Value FROM dual UNION SELECT 'Hello mi number is cc 2515' column_Value FROM dual ) SELECT 1, SUBSTR(column_value, instr(column_value,'cc') + 2) FROM data WHERE column_value LIKE '%cc%' UNION SELECT 2, SUBSTR(column_value, instr(column_value,'c.c.',1) + 4) FROM data WHERE column_value LIKE '%c.c.%' UNION SELECT 3, SUBSTR(column_value, instr(column_value, 'C.C.') + 4) FROM data WHERE column_value LIKE '%C.C.%' ;

【讨论】:

    【解决方案3】:

    如果列的长度是可变的,我会给出答案(如果它是固定的则更容易):

    create table t10(
    test varchar2 (30));
    
    insert into t10 (test) values ('Hello mi number is C.C. 2313');
    
    select  substr(test,instr(test, 'C.C.'),length(test))  from t10 ar;
    

    您还可以划分 C.C. 的所有变体。抄送抄送抄送有情况时

    【讨论】:

    • 提示:在 SUBSTR 函数中,如果不指定第三个参数,则子字符串会延伸到输入字符串的末尾。 (无论如何,第三个参数显示要提取多少个字符,而不是要提取的最后一个字符的位置,因此“长度(测试)”通常不是正确的值。)
    猜你喜欢
    • 2019-02-06
    • 2015-07-30
    • 1970-01-01
    • 2013-01-15
    • 2020-01-03
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多