oracle中截取一个字符串中的数字

我记得上次我在旧系统上与客户合作时,报告中的数字和字母混淆了。
客户必须单独选择每个数字,否则无法清楚地阅读报告。
当时的系统使用的是Oracle 1 1 g,数据库版本有点旧,正则表达式支持也没有那么好。
幸运的是,我终于能够使用一些嵌套函数来分隔数字。
虽然有点慢,但问题终于解决了。
如果使用得当,REGEXP_SUBSTR 函数无疑是一个强大的工具,但它依赖于版本支持。
等等,还有一件事。
我在网上看到一篇博客,说从Oracle 1 2 c版本开始,正则表达式支持得到了很大的改进。
那时候的数据库肯定比1 1 g好。
不过话虽这么说,现在大家都在用1 9 c和2 1 c,所以这些老问题应该早就解决了。

SQL如何截取指定字段某一个字符的前面/后面的字符串

说白了,在SQL中捕获指定字段中某个字符之前或之后的字符串其实是非常容易的。
我们先来说说最重要的事情。
以SQLServer为例,截断“.”之前的字符串。
在“OPE-CZ-1 08 -003 -SE7 1 .2 ”中,您可以使用 SUBSTRING 函数,例如 SUBSTRING('OPE-CZ-1 08 -003 -SE7 1 .2 ', 1 , CHARINDEX('.', 'OPE-CZ-1 08 -003 -SE7 1 .2 ')
1 )。
还有一点,如果要截断“.”后面的字符串,请调整SUBSTRING函数的起始位置,例如SUBSTRING('OPE-CZ-1 08 -003 -SE7 1 .2 ', CHARINDEX('.', 'OPE-CZ-1 08 -003 -SE7 1 .2 ') + 1 , LENC0Z('0CZ(-'003 -SE7 1 .2 ')。

一开始觉得这个很复杂,后来发现核心逻辑其实是一样的,都是通过CHARINDEX找到特定字符的位置,然后利用这个位置来检查SUBSTRING函数的起始点和长度。
等等,还有一点,Oracle和Mysql的实现方式是一样的,只是函数名和语法可能不同。

实用建议是,遇到这类问题时,首先了解目标数据库的具体功能和语法 根据字符位置的SQL语句 很多人不注意这一点,但我认为值得一试。

oracle中 sql截取某个字符前面和后面的值

说实话,在做这种填表和数据查询的工作时,我以前在XX公司做项目的时候也遇到过类似的情况。
您提到的 aaaa 表如果创建的话,可以包含 ID、内容和分隔符等字段。
我帮你想想办法。
具体步骤可如下:
1 .填写数据时,注意分隔符的使用一致。
例如,ID为1 的记录的内容可以是“1 2 3 _4 5 6 _7 8 9 ”或“1 2 3 .4 5 6 .7 8 9 ”。
我曾经有一个客户,用逗号分隔字段,但查询时差点出现问题。
后来他改用下划线来保持统一。

2 首先尝试ID为1 的数据。
你可以在SQL中这样写: sql SELECT FROM aaaa WHERE ID = 1
这条语句应该能够找到ID为1 的整条记录。
假设其内容为“1 001 _abcde_2 3 4 ”,这是下一步的基础。

3 如果您知道该部分的长度和特殊字符的位置,那么子字符串真的很容易使用。
例如,如果您知道“abcde”前面有一个下划线,后面也有一个下划线,那么您可以准确地捕获以下内容: sql SELECT substring(content, 4 , 5 ) AS 截取结果 FROM aaaa WHERE ID = 1
结果为“abcde”。
我已经使用这个功能来处理订单号有分隔符的情况,而且效率特别高。

4 不过,当位置不固定时,Charindex就派上用场了。
该函数返回特殊字符的位置: sql SELECT charindex('_', content) AS 下划线位置 FROM aaaa WHERE ID = 1
对于“1 001 _abcde_2 3 4 ”,结果应为 4 请注意,此计数从 1 开始,而不是 0。

5 组合使用 LEFT 函数可用于从最左边缩短到特殊字符。
假设我们想在第一个下划线之前截取: sql SELECT left(content, charindex('_', content)
1 ) AS 截取前半部分 FROM aaaa WHERE ID = 1
这条语句先找到下划线位置,然后从头开始截取前半部分。
对于“1 001 _abcde_2 3 4 ”,结果是“1 001 ”。

6 我在这里遇到了参数顺序的陷阱:第一个参数是原始字符串,第二个参数是起始位置,第三个参数是长度。
例如,用第二个下划线截取第一个下划线: sql SELECT substring(content, charindex('_', content) + 1 , charindex('_', content, charindex('_', content) + 1 )
charindex('_', content)
1 ) FROM aaaa WHERE ID = 1
这一段有点复杂,但是经常使用就会习惯。
先找到第一个下划线位置,然后是第二个,然后剪掉中间部分。

最近维护XX系统时,使用LEFT+charindex来处理日志文件分析,效果不错。
但请注意,如果分隔符位于字符串末尾,则 charindex 返回 0。
这种边缘情况需要额外评估。
例如: sql IF charindex('_', 内容) > 0 THEN SELECT left(内容, charindex('_', 内容)
1 ) 否则 选择内容 END
这种万无一失的处理是必要的。

我个人没有在这方面运行过 SQL Server 2 01 9 或更高版本。
新版本可能会有更简洁的功能组合。
我记得数据在X左右,但我建议你根据当前环境检查一下。
例如,尝试“1 001 |abcde|2 3 4 ”。
如果分隔符是垂直条,看起来完全不同。