当前位置: 首页 > 面试题库 >

如何减少由子字符串和instring引起的代码重复?

屠德宇
2023-03-14
问题内容

我需要将一个以’\
n’分隔的文本字段(描述)解析为三个单独的字段。我通过利用substr和来执行此操作instr,但是它导致难以阅读和重复的sql。有没有一种方法可以创建和使用变量或表达式来保存instring函数返回的“位置”值,因此我可以将该变量传递给它substr?我在下面发布的代码可以正常工作并返回正确的结果,但是感觉不正确。有很多重复。

相关原始数据:

DBKEY       DBTIME                      DBUSER     DESCRIPTION
40846809    2013-11-18 11:04:11.0000000 abc$userid  The following Message List entry has been logged:\nError Number:5011\nDescription:Planogram: 60E90001006.0SMA :: UPC:  is not numeric\nSeverity:0
40846810    2013-11-18 11:04:11.0000000 abc$userid  The following Message List entry has been logged:\nError Number:5000\nDescription:Planogram: 60E90001006.0SMA :: ID: NEW  not 9 digits\nSeverity:0
40846811    2013-11-18 11:04:11.0000000 abc$userid  The following Message List entry has been logged:\nError Number:5001\nDescription:Planogram: 60E90001006.0SMA :: ID: NEW  not numeric\nSeverity:0

所需结果:

DBKEY       DBTIME                      USERID  ERROR_NUM   DESCRIPTION SEVERITY
40846809    2013-11-18 11:04:11.0000000 userid  5011        Planogram: 60E90001006.0SMA :: UPC:  is not numeric 0
40846810    2013-11-18 11:04:11.0000000 userid  5000        Planogram: 60E90001006.0SMA :: ID: NEW  not 9 digits    0
40846811    2013-11-18 11:04:11.0000000 userid  5001        Planogram: 60E90001006.0SMA :: ID: NEW  not numeric 0
40846812    2013-11-18 11:04:11.0000000 userid  5003        Planogram: 60E90001006.0SMA :: ID: NEW  ID must begin with 000,200,220,900,950,990,or 999   0

当前代码:

SELECT DBKEY,DBTIME,
        SUBSTR(DBUSER,INSTR(DBUSER,'$',1,1)+1) AS USERID,
        SUBSTR(ERROR_NUM,INSTR(ERROR_NUM,':')+1) AS ERROR_NUM,
        SUBSTR(DESC1,INSTR(DESC1,':')+1) AS DESCRIPTION,
        SUBSTR(SEVERITY,INSTR(SEVERITY,':')+1) AS SEVERITY
FROM(
    SELECT l.DBKEY,DBTIME,DBUSER,
        --substring(description,first+2,second-first-2)
        SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,'\n',1,1)+2,INSTR(DESCRIPTION,'\n',1,2)-INSTR(DESCRIPTION,'\n',1,1)-2) AS ERROR_NUM,
        --substring(description,second+2,third-second-2)
        SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,'\n',1,2)+2,INSTR(DESCRIPTION,'\n',1,3)-INSTR(DESCRIPTION,'\n',1,2)-2) AS DESC1,
        --substring(description,third+2) 
        SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,'\n',1,3)+2) AS SEVERITY
        /*,
        INSTR(DESCRIPTION,''\n'',1,1) as first,
        INSTR(DESCRIPTION,''\n'',1,2) as second,
        INSTR(DESCRIPTION,''\n'',1,3) as third,
        */
    FROM EVENT_LOG l
)derivedtbl

问题答案:

我建议使用REGEXP_SUBSTR哪一个功能可以达到预期的效果:

SELECT
    l.DBKEY,
    l.DBTIME,
    REGEXP_SUBSTR(l.DBUSER, '[^$]+$')                 AS USERID,
    REGEXP_SUBSTR(l.DESCRIPTION, '[0-9]{4}')          AS ERROR_NUM,
    REPLACE(REGEXP_SUBSTR(l.DESCRIPTION, 'Planogram:[^\]+\\n'), '\n', '')
                                                      AS DESCRIPTION,
    REGEXP_SUBSTR(l.DESCRIPTION, '\d+$')              AS SEVERITY
FROM
    EVENT_LOG l;

我已经创建并测试了SQLFiddle。有关更多信息,REGEXP_SUBSTR您可能需要阅读Oracle
Docs



 类似资料:
  • 问题内容: 我正在使用以下方法从webapi捕获数据: 对于某些请求,这会由于HeapSize太小而导致OutOfMemoryError: 我已经从正常的String操作(如StringBuilder)换成了StringBuilder,但这没有帮助。我怎么解决这个问题?通过isnt作为其Android应用程序的一个选项来增加最大堆大小。 问题答案: 一种解决方案是将要下载的内容持久保存到存储中。

  • 假设我有一个字符串,如下所示: 我想把“abcd”换成“dddd”。我曾试图做这样的事: 它不起作用。有什么建议吗? 编辑:更具体地说,我在Java工作,我试图解析超文本标记语言文档,具体地说

  • Redux 很大部分 受到 Flux 的启发,而最常见的关于 Flux 的抱怨是必须写一大堆的样板代码。在这章中,我们将考虑 Redux 如何根据个人风格,团队偏好,长期可维护性等自由决定代码的繁复程度。 Actions Actions 是用来描述在 app 中发生了什么的普通对象,并且是描述突变数据意图的唯一途径。很重要的一点是 不得不 dispatch 的 action 对象并非是一个样板代码

  • 我有一些字符串,每个字符串都是某个字符串的一个或多个副本。例如: 我想把这些字符串分割成一个列表,这样每个元素都有重复的部分。例如: 由于每个字符串大约有1000个字符长,因此如果速度也相当快,那就太好了。 请注意,在我的例子中,重复都从字符串的开始开始,它们之间没有间隙,所以这比在字符串中查找最大重复的一般问题简单得多。 怎么能这样呢?

  • 问题内容: 在我的一个Java项目中,由于Java处理(而非)原语的方式,我受到代码重复的困扰。不必后手动复制到四个不同的位置相同的变化(,,,) 再次 ,对于 第三次 的时候, 再 和 再次 我来到非常接近(?)来抢购。 共识似乎收敛到两个可能的选择: 使用某种代码生成器。 你能做什么? 这就是生活! 嗯,第二种 解决方案 是我现在正在做的事情,并且它对我的理智逐渐变得危险,就像众所周知的酷刑技

  • 问题内容: 我曾经在JavaScript中这样做: Swift没有此功能,如何做类似的事情? 问题答案: 编辑/更新: Xcode 11•Swift 5.1或更高版本 用法: 不区分大小写的样本 正则表达式样本