给爷学 | 开发小记(MySQL-NULL与字符串截取)

数据库中有两种类型的空值需要处理,NULL和(N/A)

虽说是为空值,但其实(N/A)理论上不属于值的范畴,其代表的意思为不可用,类似于undefined。在一个经济运行监测系统开发的持久层业务上,我多次遇到了这个问题。因为设计到加减乘除的计算,但是又有数据为NULL或为(N/A)的情况出现,导致我在持久层的数据处理上花费了大量的时间,最终确定了一个方法——用计算函数处理(N/A)。

起初我多次尝试,使用IFNULL,IF( XXX = NULL)等判空语句来将(N/A)处理掉,方便计算也方便返回值的设置,但是我发现,各种各样的不同情况查询出来的数据也不同。当WHERE的条件有符合的条目,但是字段的值为NULL时,查询结果一般为NULL;当WHERE的条件无符合的条目,查询结果一般为(N/A);当WHERE的条件有符合的条目,但是字段的值有为NULL的有为(N/A)的,这个时候极有可能出现BULL,也有可能出现NULL。

这就很难办了,因为无法确定出现这种情况的条件是什么(就是我自己太菜了,不知道具体的原因)。

最后,在经过多次尝试之后,我发现只要将结构进行一下计算,(N/A)就不会出现了。

比如( 0 + (N/A)) = 0 、( NULL + (N/A)) =NULL。

最终呢,我在每个结果上都加了SUM( )函数,就可以有效防止(N/A)的出现,

SUM( (N/A) ) = NULL,有了NULL就好办了,IFNULL,IF( XXX = NULL)等判空语句就可以排上用场了。

SUBSTRING和Java的区别

说到批次号这个东西,那就得开始分段,举个例子:

5000 + 202106 +QWE123

上述批次号中5000代表了一种类型,202106就代表了日期2021年6月,后面的QWE123则为随机生成的字符串,他们组合在一起就成了一个批次的唯一标识符,当然这只是一种很简单的批次号组成,根据实际情况,还可以加处理人ID,还可以加地区代码等等。

在众多批次号,想要中找到自己想要的,那就得用批次号来相应的匹配,把完整的批次号拆分成拥有各自含义的小段,然后再根据情况来匹配,就能很简单的找到想要的那一条。

在一次开发中,我遇到了这个问题,Java代码中的substring( )和MySQL中的SUBSTRING( )函数虽然都字符串截取函数,但是使用方法有一点小的区别,不注意的话,出错之后找BUG实在太麻烦了(亲身经历)。

首先substring(int beginIndex,int endIndex) 方法

此方法中的 beginIndex 表示截取的起始索引,截取的字符串中包括起始索引对应的字符;endIndex 表示结束索引,截取的字符串中不包括结束索引对应的字符,如果不指定 endIndex,则表示截取到目标字符串末尾。该方法用于提取位置 beginIndex 和位置 endIndex 位置之间的字符串部分。

这里需要特别注意的是, 对于开始位置 beginIndex, Java 是基于字符串的首字符索引为 0 处理的,但是对于结束位置 endIndex,Java 是基于字符串的首字符索引为 1 来处理的。(此处参考
Java截取(提取)子字符串(substring()) (biancheng.net)

 

字符串中的字符索引

MySQL中获取子串函数 SUBSTRING(s,n,len) 带有 len 参数的格式,从字符串 s 返回一个长度同 len 字符相同的子字符串,起始于位置 n。

也可能对 n 使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的第 n 个字符,即倒数第 n 个字符,而不是字符串的开头位置。(此处参考MySQL SUBSTRING函数:截取字符串 (biancheng.net)

使用 SUBSTRING 函数获取指定位置处的子字符串

简单来说,就是Java中以0开始,MySQL中是以1开始的。

网友评论

3条评论

发表

网友评论

3条评论

发表

最新评论

06月28日 14:27

06月25日 08:21

06月24日 11:38

推荐文章

合集

给爷学

合集

共3篇

总阅读

6776

总评论

4

总获赞

10

总分享

0

彩龙

Copyright © 2008-2020 彩龙社区(https://www.clzg.cn) 版权所有 All Rights Reserved.

免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。

经营许可证编号:滇B2-20090009-7

下载我家昆明APP 下载彩龙社区APP