PostgreSQL中如何将子查询整合到ANY运算符实现查询合并?
问题解决:动态生成食材匹配数组的SQL修正
原硬编码食材模糊匹配的SQL可以正确返回结果,但通过string_agg动态生成匹配字符串后返回0条结果,核心原因是类型不匹配:
- 原查询中
ANY('{%yeast%, ...}')使用的是PostgreSQL的数组类型,ANY会遍历数组中的每个元素做匹配 string_agg返回的是单个字符串,即使手动拼接{},它依然是字符串类型,ANY会把整个字符串当成一个匹配模式,而非多个独立模式,导致匹配失败
解决方案1:直接生成数组(推荐)
用array_agg替代string_agg,直接生成PostgreSQL数组类型,让ANY可以正确遍历匹配:
SELECT * FROM receipts WHERE true = ALL( SELECT name ~~* ANY( SELECT array_agg('%' || name || '%') FROM home_ingredients ) FROM ingredients WHERE ingredients.receipt_id = receipts.id )
解决方案2:将字符串转换为数组
如果需要保留string_agg,可以用string_to_array将生成的字符串转换为数组,注意分隔符要和string_agg的分隔符一致(这里是, ):
SELECT * FROM receipts WHERE true = ALL( SELECT name ~~* ANY( SELECT string_to_array(string_agg('%' || name || '%', ', '), ', ') FROM home_ingredients ) FROM ingredients WHERE ingredients.receipt_id = receipts.id )
内容的提问来源于stack exchange,提问作者Boti
相关产品推荐
相关产品推荐

