1.需求说明
项目中有这样一个需求,根据条件标记数据,需要完成的内容如下:
- 对符合条件的数据进行标记;
- 无值则使用标记值;
- 有值则判断是否包含当前标记,包含则不处理,不包含则追加。
2.SQL编程
话不多说,上SQL:
UPDATE targetTableName
SET targetField =
CASE
WHEN targetField IS NULL THEN #{ targetValue }
WHEN STRPOS ( targetField, #{ targetValue } ) = 0 THEN CONCAT ( targetField, ',', #{ targetValue } )
ELSE targetField
END
WHERE
whereConditionStatement
这里进行一些说明:
- 为什么需要判断
IS NULL
SELECT STRPOS( NULL, 'g' )
-- 结果是(Null)
如果标记字段为空,使用STRPOS
函数就没有返回值,而CASE WHEN
需要一个布尔值。
- STRPOS函数
SELECT STRPOS( 'abcdefg', 'a' )
-- 结果是 1
SELECT STRPOS( 'abcdefg', 'g' )
-- 结果是 7
SELECT STRPOS( 'abcdefg', 'h' )
-- 结果是 0
- ELSE必须要有值
这个是个坑😢如果不写ELSE
语句,前两个条件不符合时,标记字段的值将被设置为null
。
3.总结
话说为什么不用LIKE
呢?
SELECT NULL LIKE '%a%'
-- 结果也是 (Null)
SELECT 'abcdefg' LIKE '%a%'
-- 结果是 t
实际上是可以使用的,只不过要对#{targetValue}
拼接%
。
-- 以下为MySQL语法(两种方式都是可以使用到索引的)
SELECT COUNT( 1 ) FROM dataTableName WHERE field LIKE 'str';
SELECT COUNT( 1 ) FROM dataTableName WHERE INSTR(field , '%str%') > 0;