Подтвердить что ты не робот

Postgresql SELECT, если строка содержит

Итак, у меня есть в моем 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" вместо фактического значения данных в этом столбце.

Как передать имя тега шаблону?

4b9b3361

Ответ 1

Вы должны использовать 'tag_name' вне кавычек; затем его интерпретируется как поле записи. Конкатенация с использованием '||' с буквальными процентными знаками:

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

Ответ 2

Я лично предпочитаю более простой синтаксис оператора ~.

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

Стоит прочитать Разницу между LIKE и ~ в Postgres, чтобы понять разницу. `

Ответ 3

Правильный способ поиска подстроки - использовать функцию position вместо выражения like, для которого требуется экранирование %, _ и escape-символ (\ по умолчанию):

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

Ответ 4

В дополнение к решению с 'aaaaaaaa' LIKE '%' || tag_name || '%' 'aaaaaaaa' LIKE '%' || tag_name || '%' 'aaaaaaaa' LIKE '%' || tag_name || '%' есть position (обратный порядок аргументов) и strpos.

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

Помимо того, что является более эффективным (LIKE выглядит менее эффективным, но индекс может что-то изменить), есть очень незначительная проблема с LIKE: разумеется, tag_name не должно содержать % и особенно _ (подстановочный знак одного символа), чтобы не давать ложных срабатываний.

Ответ 5

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

tag_name должно быть в tag_name иначе это приведет к ошибке, так как имя тега не существует