所以我在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传递给模式??
答案 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不存在