Ответ 1
Вы должны использовать 'tag_name' вне кавычек; затем его интерпретируется как поле записи. Конкатенация с использованием '||' с буквальными процентными знаками:
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%';
Итак, у меня есть в моем 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' вне кавычек; затем его интерпретируется как поле записи. Конкатенация с использованием '||' с буквальными процентными знаками:
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%';
Я лично предпочитаю более простой синтаксис оператора ~.
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;
Стоит прочитать Разницу между LIKE и ~ в Postgres, чтобы понять разницу. `
Правильный способ поиска подстроки - использовать функцию position
вместо выражения like
, для которого требуется экранирование %
, _
и escape-символ (\
по умолчанию):
SELECT id FROM TAG_TABLE WHERE position(tag_name in 'aaaaaaaaaaa')>0;
В дополнение к решению с '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 не должно содержать %
и особенно _
(подстановочный знак одного символа), чтобы не давать ложных срабатываний.
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || "tag_name" || '%';
tag_name
должно быть в tag_name
иначе это приведет к ошибке, так как имя тега не существует