'LIKE ('%this%' ИЛИ '%that%') и что-то=другое' не работает
Я столкнулся с проблемой при выполнении выборки данных, где пытаюсь найти строки, соответствующие нескольким паттернам одновременно.
Вот мой запрос:
LIKE ('%this%' or '%that%') and something=else
Однако, он возвращает ноль результатов.
Следующие запросы работают нормально:
LIKE '%this%' and something=else
и
LIKE '%that%' and something=else
Они оба возвращают результаты.
Вопрос в том: возможно ли получить все результаты в одном запросе? И как будет обрабатываться ситуация, если строка соответствует обоим паттернам?
5 ответ(ов)
К сожалению, вы не можете использовать этот синтаксис в SQL.
Попробуйте следующий вариант:
(column1 LIKE '%this%' OR column1 LIKE '%that%') AND something = else
Обратите внимание на использование скобок! Они необходимы вокруг выражения с OR
.
Без скобок выражение будет интерпретировано как A OR (B AND C)
, что не даст вам ожидаемых результатов.
Вместо использования LIKE
, используйте REGEXP
. Например:
SELECT * FROM table WHERE value REGEXP 'THIS|THAT';
Вот несколько примеров использования REGEXP
в MySQL:
mysql> SELECT 'pi' REGEXP 'pi|apa'; -- 1
mysql> SELECT 'axe' REGEXP 'pi|apa'; -- 0
mysql> SELECT 'apa' REGEXP 'pi|apa'; -- 1
mysql> SELECT 'apa' REGEXP '^(pi|apa)$'; -- 1
mysql> SELECT 'pi' REGEXP '^(pi|apa)$'; -- 1
mysql> SELECT 'pix' REGEXP '^(pi|apa)$'; -- 0
Как видно из примеров, REGEXP
позволяет выполнять более сложные проверки по сравнению с LIKE
, включая использование регулярных выражений для поиска. Подробности можно найти в документации MySQL: REGEXP Documentation.
Попробуйте что-то вроде:
WHERE (column LIKE '%this%' OR column LIKE '%that%') AND something = else
Это выражение позволяет выбирать записи, где значение в столбце соответствует одному из указанных шаблонов, а также удовлетворяет дополнительному условию. Убедитесь, что используете правильные названия столбцов и соответствуете синтаксису SQL для вашей базы данных.
Чтобы разнести условия LIKE
на два отдельных выражения, вы можете переписать ваш SQL-запрос следующим образом:
(fieldname1 LIKE '%this%') OR (fieldname1 LIKE '%that%') AND something = else
Это позволит вам более четко структурировать запрос и упростить его дальнейшую модификацию, если это потребуется. Главное, убедитесь, что логические операторы правильно расставлены, чтобы избежать ошибок в логике запроса.
Скорее всего, у вас вопрос, почему нельзя разбить данный SQL-запрос на несколько частей для улучшения читаемости или производительности. В общем случае, это возможно и может быть даже полезно. Например, вы можете создать временную таблицу для хранения результатов первого условия, а затем выполнять дальнейшие операции с ней.
Примерно так:
WITH FilteredResults AS (
SELECT *
FROM <blah>
WHERE (fieldA LIKE '%THIS%' OR fieldA LIKE '%THAT%')
)
SELECT *
FROM FilteredResults
WHERE something = else;
Такой подход может сделать запрос более структурированным и легче читаемым, особенно если он становится слишком сложным. Однако, стоит учесть, что это может повлиять на производительность в зависимости от вашего случая. Всегда полезно протестировать различные варианты, чтобы найти наиболее эффективный.
SQL: выбрать только строки с максимальным значением в столбце
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Удаление с использованием JOIN в MySQL
SQL LIKE без подстановочных символов эквивалентен '='?
java.sql.SQLException: Не найден подходящий драйвер для jdbc:mysql://localhost:3306/dbname