使用 Postgresql 查询字符串中包含某个字符串

我的 Postgresql 中有如下数据

TAG_TABLE
==========================
id            tag_name
--------------------------
1             aaa
2             bbb
3             ccc
为了简化我的问题, 我要做的是选择 SELECT 'id' from TAG_TABLE when a string "aaaaaaaa" contains the 'tag_name'.。 因此,理想情况下,它应该只返回“1”,这是标记名称'aaa'

的ID

这是我目前所做的:

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

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

我如何传递 tag_name 到对应的模式上去??

469555 次浏览

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

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

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

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

值得通读Postgres中LIKE和~的区别来理解区别。 ' < / p >

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

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

除了有'aaaaaaaa' LIKE '%' || tag_name || '%'的解决方案 position(参数顺序颠倒)和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不存在