oracle中截取后几位用法及详解

说实话,Oracle的人玩SQL还是蛮厉害的。
你提到的将 substr 与 Greater 匹配的方法实际上很有趣。
我之前在处理截取订单号的最后四位数字以创建唯一索引的任务时使用过类似的想法。

具体场景是这样的:有一个字段叫order_id,数据很乱。
有些是“ORD1 2 3 4 5 6 ”,有些是带有前导零的“ORD0001 2 3 ”。
直接使用 substr(order_id, -4 ) 在某些 DB 版本中会出现问题,因为负数位置处理不统一。
所以我采用了一种折中的写法:
sql SELECT substr(order_id, 最大(-4 , -length(order_id))), 4 给他命令 WHERE order_id IS NOT NULL;
说实话,这个写法我花了很长时间才摸索出来。
Greatest(-4 , -length(order_id)) 尤其重要。
例如,在“ORD1 2 3 4 5 6 ”中,-length(order_id)为-9 ,Greatest(-4 ,-9 )返回-4 ,substr正常截取后四位。
如果是“ORD0001 ”,-length(order_id)为-5 ,最大值变为-4 ,确保截距长度始终为4
我在这里测试过,它在Oracle 1 2 c和1 9 c上都有效。
不过,有一个小错误需要注意:如果 order_id 为 NULL,-length(NULL) 会报错。
因此,需要在前面添加一个IS NOT NULL过滤条件。
Oracle在这方面比MySQL要好得多。
如果将 NULL 传递给 length,至少它不会崩溃。

有趣的是,后来我遇到了更复杂的场景,比如截取身份证的后6 位,但前位可能是字母。
目前,直接使用 substr 是行不通的。
您需要使用 regexp_extract:
sql SELECT regexp_extract(order_id, '[0-9 ]{6 }$', 1 ) FROM 订单;
这种方法直接匹配正则表达式中的最后6 个数字,比手动拦截要好得多。
但这是另一种玩法。
你最好的方法确实有点小技巧,适合处理简单的定长后缀拦截。

SQL 字符串函数如何截取最后几位?

当谈到SQL截取字符串最后一位数字时,我以前遇到过麻烦。
记得当时,我还在一家小公司做数据库管理。
当时,我使用的是一个名为 PostgreSQL 的旧数据库系统。
那东西不支持 RIGHT() 函数,所以我不得不硬着头皮使用 SUBSTRING() 加 LEN()。

曾经,我有一个用户表,其中包含用户的手机号码字段。
领导突然说要做一个功能,显示用户手机号码的后四位。
当时我很困惑,我心想,“用 RIGHT() 真是太容易了,但 PostgreSQL 真是令人沮丧。
”最后无奈,只好硬着头皮写了一条SQL:
sql 从用户中选择 SUBSTRING(phone FROM LENGTH(phone)
4 + 1 FOR 4 );
当时我觉得这段代码看起来很奇怪,但是运行起来没有任何问题,成功完成了任务。
不过,当时我并不知道,Oracle其实有更简单的方法。
可以直接使用负索引从末尾开始倒数,这样会容易得多。

现在回想起来,当年我确实踩过很多坑。
例如,有时字段为空或不够长。
如果不处理,会直接返回空值或者报错。
那将是多么尴尬啊。
后来吸取教训,用CASE语句来确定长度。
如果这还不够,我会直接返回 NULL,这样就不会出现 UI 问题。

嘿嘿,说到这里,我在这方面还是很有经验的,但是如果你问的是其他数据库,比如MySQL或者SQLServer,那我就不敢废话了。
毕竟,我主要从事 PostgreSQL 和 Oracle 工作。
但一般来说,根据自己使用的数据库选择合适的方法,并注意边界情况的处理,这样就不会出现大的错误。

sql语句,如何截取指定字段某一个字符出现后的后面的字符串吗

ManagementStudio是一款使用起来确实并不复杂的软件。

首先在桌面上找到它,也就是“Management Studio”图标,然后点击它。

然后,你会看到一个界面,左上角有“New Query”字样,点击它。

接下来,你会看到一个输入框,在其中输入以下 SQL 语句: sql select substring(name, charindex(';', name) + 1 , len(name)
charindex(';', name)) from test2 ;
这个语句的作用是什么? 也就是说,在“test2 ”表中,找到一个名为“name”的字段,然后找到第一个出现分号“;”的地方。
出现,并截取分号之后的所有内容。

输入后,单击左上角的“执行”按钮。

然后你就会看到结果,即该字段中分号后面的字符串已经被成功截获。