PostgreSQL实现MySQL FIND_IN_SET,列中包含A又包含B

  • 字段中包含某个值:利用ANY/SOME实现 ,参考URL
  • 列中包含多个值:
    1. 数据库字段:先将多行一列的数据合并为一个数组
      1. string_agg:string_agg(字段,'分隔符' ORDER 排序规则):{1,2,3,4} --假设分隔符是,
      2. array_agg:array_agg(字段 ORDER 排序规则):{1,2,3,4}
    2. 参数值:将多个值转为数组
      1. ARRAY['1','2','3']:在代码或Mybaits中ForEach
      2. STRING_TO_ARRAY(字符串,分隔符):STRING_TO_ARRAY('1,2,3',',')

  • 表结构

以t_package_customization_app表为例,

1对多关系,package_id对应多个portal_idPostgreSQL实现MySQL FIND_IN_SET,列中包含A又包含B_第1张图片


  • 字段值包含某个值(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; 

 

 

 

 

 

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