Как использовать CONTAINS с CURDATE?

#mysql #sql #date

#mysql #sql #Дата

Вопрос:

У меня есть таблица, которая содержит следующие значения:

 id | competition_id | season_id | name        | update_at
 1         5              512      2018/2019     2019-03-22 08:55:22
 2         5              NULL     Venezuela     NULL
 3         5              85       2017/2018     2019-02-15 08:55:22
 4         5              NULL     90'           NULL
 5         5              72       2016/2017     NULL  
  

Мне нужно вернуть все записи, в name столбце которых указан текущий год, что я и сделал:

 SELECT * FROM mytable WHERE name CONTAINS YEAR(CURDATE())
  

но я получаю:

Синтаксическая ошибка в SQL-запросе возле строки 1 «СОДЕРЖИТ YEAR (CURDATE ()) LIMIT 0, 25»

Ответ №1:

Вы можете использовать следующее решение с помощью LIKE :

 SELECT * FROM table_name WHERE name LIKE CONCAT('%', YEAR(CURDATE()), '%');
  

Другое решение, использующее INSTR или LOCATE :

 -- using INSTR
SELECT * FROM table_name WHERE INSTR(name, YEAR(CURDATE())) > 0;

-- using LOCATE
SELECT * FROM table_name WHERE LOCATE(YEAR(CURDATE()), name) > 0;
  

Вы также можете использовать следующее решение, используя REGEXP :

 SELECT * FROM table_name WHERE name REGEXP YEAR(CURDATE());
  

демонстрация на dbfiddle.uk

Примечание: В MySQL нет функции CONTAINS для поиска строки в другой строке. CONTAINS является ключевым словом в MySQL и может использоваться для пространственных данных (более ранний MySQL 8.0 — не рекомендуется с MySQL 5.7.6).

Комментарии:

1. есть более быстрые, чем CONTAINS ?