【问题标题】:Trying to parse data out in Oracle using regexp_substr尝试使用 regexp_substr 在 Oracle 中解析数据
【发布时间】:2017-11-01 17:37:16
【问题描述】:

所以我试图从这个表中解析出具有单个标识符(file_name)的数据,并且有不同的属性,例如 first_name、last_name、date_of_birth。这里的问题是其他非标识符列(例如 first_name、last_name 等)具有多个条目,由我猜测 chr(10) 分隔。其中一些字段也可以为空(如下所示的 DOB) 例如: 原始数据将有:filename.xml johnjacob schmidtmiller, 1-02-03 我需要它变成: 文件名.xml 约翰·施密特 1-02-03 文件名.xml jacob miller null

我拥有的如下:

    select file_name
          , regexp_substr(first_name, '([^chr(10)]*)(chr(10)|$)', 1, level, null, 1) as first_name
         , regexp_substr(last_name, '([^chr(10)]*)(chr(10)|$)', 1, level, null, 1) as last_name
         , regexp_substr(dob, '([^chr(10)]*)(chr(10)|$)', 1, level, null, 1) as dob
     from TABLE
  connect by level <= regexp_count(first_name, chr(10)) + 1
      and prior file_name = file_name
      and prior sys_guid() is not null
    order by file_name

我目前只返回每个文件名的名字/姓氏/出生日期等。我做错了什么?

提前致谢!

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    请查找 (google) 并阅读 REGEXP_SUBSTR 函数的文档。您会看到它明确指出,默认情况下,它将 LINE 的开头和结尾视为整个输入字符串的开头和结尾。这个默认行为可以在第五个参数中被覆盖(现在在你的代码中是NULL)。即,将NULL 更改为'm'(在对函数的所有调用中)并再次运行。

    来自文档:

    'm' 将源字符串视为多行。 Oracle 将 ^ 和 $ 分别解释为源字符串中任何位置的任何行的开始和结束,而不仅仅是整个源字符串的开始或结束。如果省略此参数,Oracle 会将源字符串视为单行。

    新增:此外,当我们希望chr(10) 表示换行符时,它不应该在带引号的子字符串中。

    [^chr(10)]
    

    (在带引号的字符串中)并不意味着除 LF(换行)以外的任何字符。相反,它表示除 c、h、r、1、0、( 和 ) 以外的任何字符。

    相反,搜索模式必须使用连接在带引号的字符串和 CHR(10) OUTSIDE 引号之间交替。

    '([^chr(10)]*)(chr(10)|$)'
    

    应该是

    '([^'  ||  chr(10)  ||  ']*)('  ||  chr(10)  ||  '|$)'
    

    还请注意,重要的是,我们可以在带引号的字符串外(为了便于阅读)使用空格,但不能在字符串内使用空格。例如,插入符号^ 之后的单引号必须紧跟在插入符号之后;如果我们在那里添加一个空格,“为了易读性”,搜索模式将变得不正确。连接运算符|| 在引用的片段之外,因此我们可以在它们周围随意添加空格。

    【讨论】:

    • 对不起。我确实尝试过阅读它,但文档似乎太混乱了,并且从文档中看起来它接受的输入数量不一致。可能是我想多了?
    • @icerabbit - 它接受多少输入取决于您的 Oracle 版本。至少从 10.1 版开始,第五个参数就出现了。较新的(自 11.1 起)是第六个参数,即在您的示例中完成大部分工作的反向引用。 (在 Oracle 11.1 之前,该解决方案不会奏效!)但是对于第五个参数的解释,您现在有 NULL,在所有版本中都是相同的。
    • 所以我为 first_name 拥有的示例数据条目是:john(chr(10))jacob。我的功能似乎只是在 CR 之间寻找数据。如何使它从字符串的开头开始,返回该部分,然后查找 CR 之后或之前的任何内容?
    • 似乎当我将转储函数与 chr(10) 一起使用时,它不喜欢它。我一直在正确使用该功能。所以我只是操纵了原始数据集并用不同的字符替换了它们,该函数可以 100% 正常工作。不知道为什么会这样,知道为什么吗?非常感谢!
    • @icerabbit - 我想我知道发生了什么,我会添加到我的答案中。
    猜你喜欢
    • 2016-05-11
    • 2016-10-16
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2016-02-20
    • 2011-10-29
    • 2016-05-22
    相关资源
    最近更新 更多