sql-如果字符串包含Postgresql SELECT

所以我的Postgresql中有一个:

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

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

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

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

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

如何将tag_name传递给模式?

user2436815 asked 2019-10-08T10:43:45Z
4个解决方案
77 votes

您应该在引号之外使用“ tag_name”; 然后将其解释为记录的字段。 使用“ ||”连接 具有文字百分号:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%';
Frans van Buul answered 2019-10-08T10:43:56Z
27 votes

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

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

值得阅读Postgres中的LIKE和〜之间的差异以了解差异。`

keithhackbarth answered 2019-10-08T10:44:26Z
5 votes

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

SELECT id FROM TAG_TABLE WHERE position(tag_name in 'aaaaaaaaaaa')>0;
Tometzky answered 2019-10-08T10:44:52Z
3 votes

除了带有%的解决方案之外是_(参数的逆序)和strpos

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

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

Joop Eggen answered 2019-10-08T10:45:25Z
translate from https://stackoverflow.com:/questions/23320945/postgresql-select-if-string-contains