所以我在Postgresql中有一个

TAG_TABLE
==========================
id            tag_name       
--------------------------
1             aaa
2             bbb
3             ccc

为了简化问题, 我要做的是选择'id'从TAG_TABLE当字符串“aaaaaaaa”包含'tag_name'。 因此,理想情况下,它应该只返回“1”,这是标签名称'aaa'的ID

这是我目前所做的:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'

但显然,这是行不通的,因为postgres认为'%tag_name%'意味着包含子字符串'tag_name'的模式,而不是该列下的实际数据值。

我如何传递tag_name模式??


你应该在引号外使用tag_name;然后它被解释为记录的字段。使用'||'与字面百分比符号连接:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%';

记住LIKE是区分大小写的。如果你需要一个不区分大小写的比较,你可以这样做:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || LOWER(tag_name) || '%';

我个人更喜欢简单的~操作符语法。

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

值得一读Postgres中LIKE和~的区别。 `


搜索子字符串的正确方法是使用位置函数而不是类似的表达式,这需要转义%,_和一个转义字符(默认为\):

SELECT id FROM TAG_TABLE WHERE position(tag_name in 'aaaaaaaaaaa')>0;

此外,解决方案有'aaaaaaaa' LIKE '%' || tag_name || '%'存在 是位置(参数的反向顺序)和strpos。

SELECT id FROM TAG_TABLE WHERE strpos('aaaaaaaa', tag_name) > 0

除了什么更有效(LIKE看起来效率较低,但索引可能会改变事情),LIKE还有一个非常小的问题:tag_name当然不应该包含%,特别是_(单字符通配符),以避免误报错。


SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || "tag_name" || '%';

Tag_name必须在引号中,否则将给出错误,因为Tag_name不存在