FIND_IN_SET()
SELECT
FIND_IN_SET('A', 'A,B,C'), #找到值 返回1
FIND_IN_SET('D', 'A,B,C'), #没找到值 返回0
FIND_IN_SET('D', ''), #第二个参数是空字符串 返回0
FIND_IN_SET(NULL, 'A,B,C'), #搜索值是null 返回null
FIND_IN_SET('D', NULL); #被搜索值null 返回null
注意:第二个参数可以是列名,不可以用SQL语句
SUBSTRING_INDEX()
SELECT
SUBSTRING_INDEX('www.mysql.com', 'z', 1), # www.mysql.com
SUBSTRING_INDEX('www.mysql.com', '.', -2),# mysql.com
SUBSTRING_INDEX('www.mysql.com', '.', 0); # null
三个参数(都必填):
参数1:可以是列名 ,也可以是String常量
参数2:分割符() 找不到该分隔符就返回"参数1"的值
参数3:N 可以是正数也可以是负数,正数从下标从1开始,负数从尾部下标-1开始(第三个参数不包括分隔符)
JSON_UNQUOTE() && JSON_EXTRACT() 【配套使用】
SELECT
JSON_UNQUOTE (
JSON_EXTRACT( JSON_EXTRACT (contentJson, '$.GeneralInformation' ), '$.PRName' )
) AS PRDescription
FROM
FormData
JSON_UNQUOTE:去除 JSON 字符串值两边的双引号。 JSON_EXTRACT:把json对象当作一个map集合,根据键找到的值会保留双引号("abc"),需要使用JSON_UNQUOTE函数去除双引号,JSON_EXTRACT()可以嵌套使用,从内层到外层。
GROUP_CONCAT()
SELECT GROUP_CONCAT(state)
FROM com_paasit_pai_core_processInstanceObj
OUT: 2,2,2,3,2,2,2,2
SELECT GROUP_CONCAT(DISTINCT state ORDER BY state ASC separator '-' )
FROM com_paasit_pai_core_processInstanceObj
OUT: 2-3
扩展属性:
DISTINCT 去重 ORDER BY 排序 SEPARATOR 连接符
建议:出参只有一个的时候使用,或者其他参数已分组的时候使用,切记不可在多个出参的SQL中直接使用GROUP_CONCAT函数,会造成数据丢失(其他出参只出现一列,使用GROUP_CONCAT函数的列,查出所有值合并一起)。
CONCAT_WS()
释义:
使用分隔符连接后的多个字符串
SELECT CONCAT_WS('-',state,`status` )
FROM com_paasit_pai_core_processInstanceObj
OUT:2-2 2-3 3-3
SUBSTRING()
SELECT
SUBSTRING( 'abcd1234', 1 ); #abcd1234
SELECT
SUBSTRING( 'abcd1234', 1, 3 ); #abc
参数1:表示需要截取的字符串
参数2:表示从字符串的那个位置开始截取(字符串下标从1开始)
参数3:表示要截取多少位,如果不写,表示截取从参数2指定的位置开始剩下的全部字符
CAST()
释义:将任意类型的参数值转为指定的类型的值并返回
SELECT
CAST('2022-02-28' AS DATE), #日期
CAST('10:10:10' AS TIME), #时间
CAST('2022-02-28 10:10:10' AS DATETIME); #日期时间
SELECT
CAST('123' AS UNSIGNED), #整数
CAST('123' AS DECIMAL(12,2)), #小数
CAST('张三' AS CHAR); #json
ON DUPLICATE KEY UPDATE()
批量新增和修改
<insert id="MaterialImportSQL02" parameterType="java.util.List">
INSERT INTO pai_core_minth.com_paasit_pai_core_supplier (
id,
supplierCode,
supplierNamecn,
supplierNameen,
tyoeRelationship
)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id, jdbcType=VARCHAR},
#{item.supplierCode, jdbcType=VARCHAR},
#{item.supplierNamecn, jdbcType=VARCHAR},
#{item.supplierNameen, jdbcType=VARCHAR},
#{item.tyoeRelationship, jdbcType=VARCHAR}
)
</foreach>
ON DUPLICATE KEY UPDATE
supplierCode=VALUES(supplierCode),
supplierNamecn=VALUES(supplierNamecn),
supplierNameen=VALUES(supplierNameen),
tyoeRelationship=VALUES(tyoeRelationship)
</insert>
单个新增和修改
<insert id="insertOrUpdateCameraInfoByOne" paramerType="com.pojo.AreaInfo">
insert into camera_info( cameraId,zone1Id,zone1Name,zone2Id,zone2Name,zone3Id,zone3Name,zone4Id,zone4Name)
VALUES(
#{cameraId},#{zone1Id},#{zone1Name}, #{zone2Id},
#{zone2Name}, #{zone3Id}, #{zone3Name},
#{zone4Id}, #{zone4Name},)
ON DUPLICATE KEY UPDATE
cameraId = VALUES(cameraId),
zone1Id = VALUES(zone1Id),zone1Name = VALUES(zone1Name),
zone2Id = VALUES(zone2Id),zone2Name = VALUES(zone2Name),
zone3Id = VALUES(zone3Id),zone3Name = VALUES(zone3Name),
zone4Id = VALUES(zone4Id),zone4Name = VALUES(zone4Name)
</insert>
奇技淫巧(在开发中就不用在代码里set值,直接在SQL里生成ID和时间):
UUID():根据 RFC 4122 生成一个通用唯一标识符(UUID)并返回
NOW():按 YYYY-MM-DD hh:mm:ss
格式返回当前时间和日期
ifnull():如果第一个参数为 NULl
,返回第二个参数,否则返回第一个参数。