如何在PostgreSQL中判断一个记录值是否为另一个的子串?
PostgreSQL中筛选子串匹配记录的解决方案
你的需求是筛选出text_1作为text_2子串的记录,等价于Python中的text_1 in text_2逻辑。原代码里用的SIMILAR TO无法实现这个效果——它要求字符串完全匹配或符合特定正则模式,而非子串包含。
以下是几种可行的实现方式:
方法1:使用LIKE操作符
通过通配符%匹配任意长度的字符,把text_1包裹在通配符之间,就能判断text_2是否包含text_1:
SELECT text_1, text_2 FROM texts WHERE text_2 LIKE '%' || text_1 || '%';
方法2:使用POSITION函数
POSITION(substr IN str)返回子串在目标字符串中的起始位置,找不到则返回0,判断结果大于0即可:
SELECT text_1, text_2 FROM texts WHERE POSITION(text_1 IN text_2) > 0;
方法3:使用STRPOS函数
STRPOS(str, substr)和POSITION功能一致,只是参数顺序相反:
SELECT text_1, text_2 FROM texts WHERE STRPOS(text_2, text_1) > 0;
额外说明
如果需要排除text_1为空字符串的情况(空串会匹配所有text_2),可以追加过滤条件:
SELECT text_1, text_2 FROM texts WHERE STRPOS(text_2, text_1) > 0 AND text_1 <> '';
以上方法都能返回你期望的输出,例如:
text_1 | text_2 --------+--------- foo_ | foo_bar sta | stack love | ilove2code
内容的提问来源于stack exchange,提问作者Danon
相关产品推荐
相关产品推荐

