如何基于Oracle SQL中的模式提取两个字符串之间的数据

我想基于特定模式从oracle SQL中的CLOB类型的列中提取数据。我用正则表达式尝试了其他事情,到目前为止没有任何效果。

PFB关于数据外观和预期输出的示例。样本数据:在此处输入图片说明

我应该提取LIST字之前的CLOB列,直到。(点)PS之前的一个字:CLOB在模式内可以有CR LF /回车符。预期产量:

预期产量:

数学家

这就是我要怎么做。请注意以下几点:

  1. 输出保留输入中存在的换行符。您没有说要删除它们;但是,您的输出未显示它们。无论如何-如果需要,可以将其删除,但这是无关的过程。
  2. 您说的是“单词”,但显然您使用的是与正则表达式中常用用法不同的含义。在regexp中,“单词字符”仅是字母,数字和下划线;但是您的“单词”包括方括号,等号,还有谁知道呢。我将术语“单词”解释为表示连续的非空白字符的任何序列。

这是我们如何重新创建您的数据的方法。当您在此处提出问题时,这就是您应该如何提供示例数据-而不是我们无法在SQL编辑器中复制和粘贴的图像。

CREATE TABLE sample_data( col_a varchar2(20), col_b CLOB );

INSERT INTO sample_data VALUES
('12345', to_clob(
'Created:2/28/2019
Updated:1/19/2021
LIST:[ABC][DEF][GHI]
[LMNO][PQRST]
[Location=BLAH].[City=BLAH]'));

INSERT INTO sample_data VALUES
('12346', to_clob(
'Created:2/28/2019
Updated:1/19/2021
LIST:[ABC][DEF][GHI]
[LMNO][PQRST]
[SOC].[RAW]'));

commit;

然后是查询和输出。请注意,根据您的界面(在我的例子中是:SQL Developer,它使用类似SQL * Plus的界面),您可能需要更改一些设置,以便输出不会被截断。特别是在SQL * Plus中,默认情况下,CLOB列被截断为80个字符;我不得不

set long 100

所以-查询和输出:

select col_a, col_b,
       regexp_substr(col_b, '(\s|^)(LIST:[^.]*?)\s+\S+\.', 1, 1, null, 2)
         as result
from   sample_data
;

COL_A COL_B                          RESULT                        
----- ------------------------------ ------------------------------
12345 Created:2/28/2019              LIST:[ABC][DEF][GHI]          
      Updated:1/19/2021              [LMNO][PQRST]                 
      LIST:[ABC][DEF][GHI]                                         
      [LMNO][PQRST]                                                
      [Location=BLAH].[City=BLAH]                                  

12346 Created:2/28/2019              LIST:[ABC][DEF][GHI]          
      Updated:1/19/2021              [LMNO][PQRST]                 
      LIST:[ABC][DEF][GHI]                                         
      [LMNO][PQRST]                                                
      [SOC].[RAW]  

正则表达式匹配单个空格字符字符串((\s|^)的开头,然后匹配允许匹配的所需字符,LIST:其后是最少几个连续的非周期字符(特别是将匹配空格和换行符),以允许匹配-继续一个或多个空白字符,后跟一个单词(1个或多个非空白字符的字符串)和文字句号(\.)。

我们必须返回的表达式用括号括起来,以便我们可以从返回regexp_substr这样的表达称为“捕获组”。正则表达式(\s|^)出于必要(替代)包括另一个捕获组,因此我们必须返回的捕获组是正则表达式中第二个捕获组这是最后一个参数要regexp_substr执行的操作:它指示函数返回第二个捕获组。

请注意有关句号的一个特殊情况(与括号表达式中转义的更一般的概念有关):必须转义句号以表示正则表达式的句号,而不是“任何字符”;但是,在(否定的)方括号表达式中[^.]*?不能转义代表文字期间而不是“任何字符”的句点Oracle遵循POSIX标准的ERE(扩展正则表达式)方言,该标准说,转义序列在方括号表达式中无效。这与其他正则表达式方言不同,并且使很多用户感到困惑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何提取日志文件中两个字符串之间的文本?

来自分类Dev

如何提取两个字符串之间的字符串

来自分类Dev

如何在SQL中删除两个字符串之间的空间

来自分类Dev

如何在SQL中的两个字符串之间获取确切的字符差异

来自分类Dev

如何在Sublime中替换两个字符之间的字符串

来自分类Dev

如何在整个文本中的两个字符之间替换字符串?

来自分类Dev

如何计算字符串中两个字符之间的长度

来自分类Dev

如何在Java中的两个字符之间获取字符串?

来自分类Dev

如何在Java中的两个字符之间获取字符串?

来自分类Dev

如何在Java中的两个字符之间获取字符串?

来自分类Dev

如何获取bash脚本中两个字符之间的字符串?

来自分类Dev

如何在Oracle中使用regexp_replace提取两个字符串之间的值?

来自分类Dev

选择语句获取 Oracle 中两个字符串之间的值

来自分类Dev

如何忽略在两个字符串之间出现特定模式的字符串?

来自分类Dev

如何在两个字符串之间匹配某些单词(在MATLAB中)?

来自分类Dev

如何在C中两个字符串之间查找文本

来自分类Dev

如何将两个字符串连接为 Python 中为 SQL 命令分隔的两个字符串?

来自分类Dev

如何在C#中的其他两个字符串之间返回字符串?

来自分类Dev

如何删除两个字符串之间的字符串?

来自分类Dev

如何在两个字符串之间获取字符串

来自分类Dev

如何在SQL查询中添加两个字符串?

来自分类Dev

如何以自然顺序比较sql中的两个字符串

来自分类Dev

如何在bash中的两个字符之间提取字符串的一部分?

来自分类Dev

如何在Java中从ENUM的两个字符串之间随机选择一个字符串?

来自分类Dev

如何强制用户仅在两个字符/字符串之间键入TextBox?

来自分类Dev

如何比较两个字符串?

来自分类Dev

如何比较两个字符串?

来自分类Dev

如何在C中的两个字符串数组之间添加数字

来自分类Dev

如何在Scala中找到两个字符串之间的最大重叠?

Related 相关文章

  1. 1

    如何提取日志文件中两个字符串之间的文本?

  2. 2

    如何提取两个字符串之间的字符串

  3. 3

    如何在SQL中删除两个字符串之间的空间

  4. 4

    如何在SQL中的两个字符串之间获取确切的字符差异

  5. 5

    如何在Sublime中替换两个字符之间的字符串

  6. 6

    如何在整个文本中的两个字符之间替换字符串?

  7. 7

    如何计算字符串中两个字符之间的长度

  8. 8

    如何在Java中的两个字符之间获取字符串?

  9. 9

    如何在Java中的两个字符之间获取字符串?

  10. 10

    如何在Java中的两个字符之间获取字符串?

  11. 11

    如何获取bash脚本中两个字符之间的字符串?

  12. 12

    如何在Oracle中使用regexp_replace提取两个字符串之间的值?

  13. 13

    选择语句获取 Oracle 中两个字符串之间的值

  14. 14

    如何忽略在两个字符串之间出现特定模式的字符串?

  15. 15

    如何在两个字符串之间匹配某些单词(在MATLAB中)?

  16. 16

    如何在C中两个字符串之间查找文本

  17. 17

    如何将两个字符串连接为 Python 中为 SQL 命令分隔的两个字符串?

  18. 18

    如何在C#中的其他两个字符串之间返回字符串?

  19. 19

    如何删除两个字符串之间的字符串?

  20. 20

    如何在两个字符串之间获取字符串

  21. 21

    如何在SQL查询中添加两个字符串?

  22. 22

    如何以自然顺序比较sql中的两个字符串

  23. 23

    如何在bash中的两个字符之间提取字符串的一部分?

  24. 24

    如何在Java中从ENUM的两个字符串之间随机选择一个字符串?

  25. 25

    如何强制用户仅在两个字符/字符串之间键入TextBox?

  26. 26

    如何比较两个字符串?

  27. 27

    如何比较两个字符串?

  28. 28

    如何在C中的两个字符串数组之间添加数字

  29. 29

    如何在Scala中找到两个字符串之间的最大重叠?

热门标签

归档