场景:数据库表字段存的是一个字符串,用“,”分隔,查询的sql需要匹配其中某一段字符串
测试的表数据如下图:
方法1:使用LIKE
LIKE关键字用于模糊匹配,可以在查询中使用通配符进行匹配。%表示匹配任意多个字符,_表示匹配一个字符。
SELECT * FROM test t WHERE t.is_deleted = 0 AND ((t.key LIKE "%TEST_KEY_1%") OR (t.key LIKE "%TEST_KEY_2%"))
方法2:使用INSTR
INSTR函数用于查找子字符串在父字符串中的位置,如果找到则返回对应的位置,如果没找到则返回0。其中substr参数表示要查找的子字符串,str参数表示父字符串。
SELECT * FROM test t WHERE t.is_deleted = 0 AND (INSTR(t.key,"TEST_KEY_1") OR INSTR(t.key,"TEST_KEY_2"))
方法3:使用LOCATE
LOCATE函数和INSTR函数类似,用于查找子字符串在父字符串中的位置,但可以指定从父字符串的哪个位置开始查找。如果找到则返回对应的位置,如果没找到则返回0。其中substr参数表示要查找的子字符串,str参数表示父字符串,pos参数表示从哪个位置开始查找。
SELECT * FROM test t WHERE t.is_deleted = 0 AND (LOCATE("TEST_KEY_1",t.key) OR LOCATE("TEST_KEY_2",t.key))
方法4:使用POSITION
POSITION函数和INSTR函数类似,用于查找子字符串在父字符串中的位置,如果找到则返回对应的位置,如果没找到则返回0。其中substr参数表示要查找的子字符串,str参数表示父字符串。
SELECT * FROM test t WHERE t.is_deleted = 0 AND (POSITION("TEST_KEY_1" IN t.key) OR POSITION("TEST_KEY_2" IN t.key))
这四种方法返回的结果是一样的,如下图:
如果想要精准匹配的话,上面四种就不适用了,可以使用方法5
方法5:使用FIND_IN_SET
FIND_IN_SET函数用于在一个逗号分隔的字符串集合中查找一个子字符串是否存在。如果存在,则返回对应的位置,如果不存在,则返回0。其中str参数表示要查找的子字符串,set参数表示用逗号分隔的字符串集合。
SELECT * FROM test t WHERE t.is_deleted = 0 AND (FIND_IN_SET("TEST_KEY_1",t.key) OR FIND_IN_SET("TEST_KEY_2",t.key))