如何检查数组内字符串是否为另一字符串的子串?SQL实现疑问
动态数组元素与输入字符串的模糊匹配方案
你用array_contains不行是因为它只做精确匹配——它会把数组里的%abc当成普通字符串,而不是LIKE的通配符,自然匹配不上foobabc。
不用堆一堆LIKE子句的话,有两种简洁的实现方式:
方法1:用ANY操作符结合LIKE
直接把数组作为LIKE的匹配集合,语法简单:
SELECT 'foobabc' LIKE ANY (ARRAY['ghi', 'def', '%abc'])
这条语句会检查输入字符串是否匹配数组里任意一个带通配符的模式,这里'foobabc' LIKE '%abc'成立,所以返回true。
方法2:用UNNEST展开数组+EXISTS判断
如果需要更灵活的逻辑(比如数组是动态生成的,或者要加额外过滤条件),可以把数组拆成单行后检查:
SELECT EXISTS ( SELECT 1 FROM UNNEST(ARRAY['ghi', 'def', '%abc']) AS pattern WHERE 'foobabc' LIKE pattern )
UNNEST把数组拆成独立的行,EXISTS只要找到一个匹配的模式就返回true,效率也很高。
如果是在表查询里用(比如表有patterns数组列和input_str字符串列),可以这么写:
-- 用ANY的写法 SELECT * FROM your_table WHERE input_str LIKE ANY (patterns) -- 用EXISTS的写法 SELECT * FROM your_table t WHERE EXISTS ( SELECT 1 FROM UNNEST(t.patterns) AS p WHERE t.input_str LIKE p )
这些方法都不用手动拼接多个LIKE条件,不管数组是静态还是动态生成的,都能直接复用,代码更简洁好维护。
内容的提问来源于stack exchange,提问作者Top Snek
相关产品推荐
相关产品推荐

