mysql将某一列的数据根据固定字符拆分后判断存不存在

如果数据库的某个字段在存储时是用的逗号分割,如下图所示:

mysql将某一列的数据根据固定字符拆分后判断存不存在_第1张图片
例如这张表中有一个字段是用的逗号分割,其实这种设计违背了数据库三范式设计原则,如何判断这一列的值包不包含某一个值?

  • 方法一
    用mysql自带的字符串函数去判断某个字符串中有没有包含子字符串,但是这样会有问题。假设某一列的列值如下
924,1157,1158,1748,1810,11574,12483

如果我们现在需要判断1157这个Id是否存在,如果用instr这个函数此时的确可以满足需求。

但是如果把1157这个值剔除去,此时再用instr这个函数去查询,依然可以将本条数据查询出来

924,1158,1748,1810,11574,12483

因为11574这条数据是包含1157这个子字符串的,所以这条数据就被查出来了,但实际情况是这条数据不应该被查出来。
网上有使用借助help_topic这种表来将一列的值按某个特定字符拆成多个列,拆成多个列以后,相当于给这个列作一个inner join 查询或者是子查询。但是不是所有账号有使用help_topic这个表的权限,如何不借助其他表,实现准确查询1157这个id的需求?

  • 使用instr、substring、length函数完成

以下述数据为例

924,1157,1158,1748,1810,11574,12483
  1. 要想判断一个完整的1157id在不在整个字符串中,可以采用如下思路,首先就是使用instr这个函数判断两个字符串是否包含
select instr('11574','1157')

如果这个函数返回值大于0,则说明有子字符串,反之没有则忽略本条数据。

  1. 如果找到了
    则需要进一步这两个字符串长度是否相等,如果相等,则表示两个字符串直接一致。

如果不相等,则需要判断返回的结果是不是0

如果是0,则说明在开头匹配到了1157这个字符串,此时需要根据1157这个字符串的长度去找这个长度 + 1 在大字符中下标处的字符,例如1157的长度是4,4+1 = 5,则需要在大字符串中找下标为5的字符,结果11574这个字符串下标为5的字符是4,这样就不对了,因为如果是个独立的1157,下标为5的这个位置必须是一个逗号,。

如果不是0,这个时候需要判断前一位的下标是不是逗号,以及长度+1位的下标是不是逗号(当然不排除子字符串恰好处于末尾的情况)。
满足以上条件可以判断是否有一个完成的子字符串在大字符串中。

你可能感兴趣的:(Mysql,mysql,数据库)