- 字段中包含某个值:利用ANY/SOME实现 ,参考URL
- 列中包含多个值:
- 数据库字段:先将多行一列的数据合并为一个数组
- string_agg:string_agg(字段,'分隔符' ORDER 排序规则):{1,2,3,4} --假设分隔符是,
- array_agg:array_agg(字段 ORDER 排序规则):{1,2,3,4}
- 参数值:将多个值转为数组
- ARRAY['1','2','3']:在代码或Mybaits中ForEach
- STRING_TO_ARRAY(字符串,分隔符):STRING_TO_ARRAY('1,2,3',',')
- 数据库字段:先将多行一列的数据合并为一个数组
- 表结构
以t_package_customization_app表为例,
1对多关系,package_id对应多个portal_id
- 字段值包含某个值(MySQL:FIND_IN_SET)
SELECT * FROM t_package_customization t1
INNER JOIN
t_portal t2
ON CAST(t2.id AS VARCHAR) = ANY(STRING_TO_ARRAY(t1.portal_ids, ','));
- 列中包含某个值:
SELECT '1000' = ANY(STRING_TO_ARRAY('1000,2000,3000', ','));
--图1 :字符串'79'去匹配数组中的字符串元素
--图2:字符串'79,85'会认为是一个字符串元素哦,{79,85},显然元素'79'和'85'都无法与字符串'79,85'匹配
--不要搞混,如果需要匹配多个值。看下面的SQL
--正确写法:
SELECT
'79' = ANY(
array_agg(portal_id::VARCHAR ORDER BY portal_id)
),
array_agg(portal_id::VARCHAR ORDER BY portal_id)
FROM t_package_customization_app
GROUP BY package_id;
--错误写法:
SELECT
'79,85' = ANY(
array_agg(portal_id::VARCHAR ORDER BY portal_id)
),
array_agg(portal_id::VARCHAR ORDER BY portal_id)
FROM t_package_customization_app
GROUP BY package_id;
- 列中包含多个值
SELECT
--第一种方式
STRING_TO_ARRAY('79,85' ::VARCHAR, ',')
<@
array_agg(portal_id::TEXT ORDER BY portal_id) ,
--第二种方式
ARRAY['79', '85']
<@
array_agg(portal_id::TEXT ORDER BY portal_id) ,
--原数组
array_agg(portal_id::VARCHAR ORDER BY portal_id)
FROM
t_package_customization_app
GROUP BY
package_id;