我需要将一个以’\
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或更高版本 用法: 不区分大小写的样本 正则表达式样本