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

本文深入探讨了在SQL中如何高效地处理字段中的多个值,包括使用ANY/SOME进行字段值匹配,利用string_agg和array_agg函数合并及转换多行一列的数据为数组,以及在查询中如何判断列中是否包含特定值或多个值。通过具体实例,如t_package_customization_app表的package_id与多个portal_id的关系,展示了正确的SQL写法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 字段中包含某个值:利用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_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; 

 

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值