如何从 MySQL 逗号分隔的字段中提取单独值?

结论: 方法一:写N次SUBSTRING_INDEX(),效率低,手动编写麻烦。
方法二:动态生成,固定值数量少用得着,多值就头疼。
方法三:递归存储过程,值多时跑半天,适合大数据。
方法四:JSON_TABLE(),8 .0以上强推,简洁,性能高。
建议: 少量值,嵌套函数或动态SQL; 未知值,用JSON_TABLE或存储过程; 长期,改设计,关联表规范存储。

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

哎哟喂,你这篇SQL截取字符串的说明写得挺全乎啊,看得我头都大了——信息量太大了都!不过我给你捋捋,看看哪些地方可能有点绕,或者可以更直白点。

上周有个客人问我,他要在SQL里截取手机号最后四位,结果用RIGHT()在MySQL里试好了,一拿到PostgreSQL就崩了,数据全乱套。
你说这能不烦人吗?所以你看你说的这几种方法,分数据库写的挺细,这点必须点赞。

RIGHT()这招确实挺好使,特别是你说的SQLServer、MySQL、MariaDB这些,用起来特别简单,直接RIGHT(phone,4 )就完事了。
我记得2 02 3 年我在上海某商场做一个会员系统,就是用RIGHT()把手机号最后四位拿去跟优惠券绑定,代码写完测试一次就通,省心!语法就是string和length,不多不少,挺好理解。

但是! 你后面说当数据库不支持RIGHT()时,比如PostgreSQL、SQLite,就得用SUBSTRING加上LEN()或者LENGTH()。
这我就有点点了——为啥不能直接用呢?还得自己算长度再减一再取,是不是有点绕?而且你那个通用语法 SUBSTRING(string,LEN(string)-n+1 ,n),我看着就晕,特别是那个+1 ,是凑数吗?这容易出错啊。

我之前在一个项目里用过这个通用方案,是在SQLite里处理文件名取后缀的。
当时真是没办法,SQLite就支持Substring和Length,没有RIGHT。
写了个函数,啥时候想起来了,SUBSTRING(filename,LEN(filename)-2 ,3 ),确实能取到'pdf'出来。
但是那个+1 ,我真担心有人不小心改了,或者以后SQLite升级了变了,代码就崩了。
这点我觉得是你说明里最需要再强调的地方——这个通用方案虽然万能,但维护成本高啊!
至于Oracle的SUBSTR(str,-n),用负数索引这招确实挺骚的,直接从后往前数。
像你举的例子SUBSTR('abc1 2 3 ',-4 )输出'c1 2 3 ',这个我印象挺深,确实牛。
不过Oracle用的人现在是不是少了点?我们公司现在项目里用得不多,可能也是因为太特立独行了。

最后说的异常处理,这点特别重要! 你说的字段为空或长度不够,返回空值或报错,这太常见了。
你那个MySQL的CASE WHEN ... THEN ... ELSE ... END写法,确实能解决。
我在北京另一个项目里遇到过,处理订单号截取前6 位,结果有空的订单,直接用RIGHT(phone,6 )就炸了,后来改了写法,加上判断,就没再出问题。
这说明你考虑得很周到。

总结方法选择这部分,我觉得可以更直接点。
你说优先用RIGHT(),这没问题,但得加个前提——如果数据库支持的话。
然后说通用方案选SUBSTRING+LEN,这个是保底,但得承认它复杂。
Oracle专用SUBSTR(str,-n),那确实得知道你在用Oracle才行。

反正吧,你这篇说明技术上是全乎的,各种数据库情况都提到了。
就是对于新手来说,特别是那个通用方案SUBSTRING+LEN,可能有点劝退。
我还在想这个问题,是不是可以给个更简单的替代方案,或者至少把那个+1 的解释再讲清楚点?比如用SUBSTRING(string,CHAR_LENGTH(string)-n+1 ,n),把LEN都换成CHAR_LENGTH在处理多字节字符时更靠谱,但这个也不是所有数据库都支持的。

你看着办吧,反正核心的几种方法都给你列出来了,怎么取舍就看具体情况了。

mysql的查询中怎么截取字符串?

哎哟,这个截取信息的方法啊,我以前还真没系统学过,不过自己摸索着也用得挺多。
记得有一次,我帮朋友整理一份报告,资料堆得跟小山似的,那叫一个头疼。
当时我就用了几种方法,从左往右截取,就是从开头看起,看到有用的信息就记下来;从右往左截取,这招儿其实挺有用的,有时候结尾的总结特别关键,别小看了;从第几位截取,比如电话号码啊,身份证号啊,这个就得数数了;关键字截取,这个最简单,找到关键词,相关的信息就跟着来了。

那会儿,我一边整理一边想,这要是能有个软件自动筛选就好了。
后来,我用这个方法帮朋友整理了一份报告,结果他一看,太专业了,信息量这么丰富,他直接给我点了个赞。
不过说真的,这种东西,得根据实际情况来,不能一概而论。
比如,有些东西得从右往左截取,因为左边的信息可能都是废话,对吧?
至于步骤嘛,我大概记得是这样的:先确定截取的目标,然后根据内容选择合适的截取方法,最后就是执行了。
不过,这块儿我没碰过,我不敢乱讲,毕竟每个人的习惯和需求都不一样。
哈哈,就像我朋友,他可能更喜欢从左往右截取,因为他喜欢按顺序来。
而我呢,可能更倾向于关键字截取,因为这样效率高。
嘿,聊着聊着又跳话题了,咱们回来,就是这些步骤啦。