如果字符串包含,则Postgresql SELECT

时间:2014-04-27 08:10:29

标签: sql postgresql

所以我在Postgresql中有一个:

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

为了简化我的问题, 我想做的是SELECT' id'来自TAG_TABLE的字符串" aaaaaaaa"包含' tag_name'。 理想情况下,它应该只返回" 1",这是标记名称的标识' aaa'

这就是我到目前为止所做的事情:

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

但显然,这不起作用,因为postgres认为'%tag_name%'表示包含子字符串' tag_name'的模式。而不是该列下的实际数据值。

如何将tag_name传递给模式??

5 个答案:

答案 0 :(得分:81)

你应该在引号之外使用'tag_name';然后它被解释为记录的一个领域。使用'||'连接字面百分号:

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

答案 1 :(得分:30)

我个人更喜欢〜运算符的简单语法。

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

值得通过Difference between LIKE and ~ in Postgres阅读以了解其中的差异。 `

答案 2 :(得分:7)

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

\

答案 3 :(得分:3)

除了带有'aaaaaaaa' LIKE '%' || tag_name || '%'的解决方案之外 是position(参数的倒序)和strpos

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

除了效率更高(LIKE看起来效率较低,但索引可能会改变事情)之外,LIKE还有一个非常小的问题:tag_name当然不应包含%,尤其是_(单个字符通配符),不会产生误报。

答案 4 :(得分:-1)

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

tag_name应该用引号引起来,否则会出现错误,因为tag_name不存在