Поиск по шаблону, LIKE
Предположим, мы знаем, что в имени курса есть слово Linux, но точное название курса нам неизвестно. В этом случае воспользуемся функцией сопоставления с шаблоном LIKE. Передадим этой функции параметром искомую строку, заключённую с двух сторон символами процента. Символ процента — это знак подстановки, который говорит, что в этой части строки находится любое количество разных символов:
sqlite> SELECT name, lessons_amount FROM courses WHERE name LIKE('%Linux%'); name lessons_amount ---------------------- -------------- Linux. Рабочая станция 8 sqlite> |
На практике для этой функции скобки часто не используются. Тогда наш запрос примет следующий вид:
sqlite> SELECT name, lessons_amount FROM courses WHERE name LIKE '%Linux%'; name lessons_amount ---------------------- -------------- Linux. Рабочая станция 8 sqlite> |
Функции для работы с датой и временем
Хотя SQLite не имеет специального типа данных для даты и времени, воспользуемся некоторыми функциями для выполнения задач с хранением и выборкой таких значений.
|
|
Чтобы получить текущее значение даты и времени, применяется функция CURRENT_TIMESTAMP:
sqlite> SELECT CURRENT_TIMESTAMP; 2021-01-05 17:21:20 sqlite> |
В результате мы получим дату и время выполнения запроса в формате «год-месяц-число часы:минуты:секунды». Такое представление часто используется в реляционных базах данных, так как оно называется «формат баз данных».
Чтобы работать с текущей датой и временем, ещё используются функции DATE, TIME, DATETIME, которые ссылаются на текущее время посредством now:
sqlite> SELECT DATE('now'); DATE('now') ----------- 2021-01-10 sqlite> SELECT TIME('now'); TIME('now') ----------- 09:04:57 sqlite> SELECT DATETIME('now'); DATETIME('now') ------------------- 2021-01-10 09:05:02 sqlite> |
При использовании этих функций с CURRENT_TIMESTAMP мы получим аналогичный результат:
sqlite> SELECT DATE(CURRENT_TIMESTAMP); DATE(CURRENT_TIMESTAMP) ----------------------- 2021-01-10 sqlite> SELECT TIME(CURRENT_TIMESTAMP); TIME(CURRENT_TIMESTAMP) ----------------------- 09:17:37 sqlite> SELECT DATETIME(CURRENT_TIMESTAMP); DATETIME(CURRENT_TIMESTAMP) --------------------------- 2021-01-10 09:17:46 sqlite> |
На практике функции CURRENT_TIMESTAMP и now взаимозаменяемые. Используйте тот вариант, который считаете удобным.
Дата и время также выделяются из строки:
sqlite> SELECT DATE('2021-01-05 17:21:20'); DATE('2021-01-05 17:21:20') --------------------------- 2021-01-05 sqlite> SELECT TIME('2021-01-05 17:21:20'); TIME('2021-01-05 17:21:20') --------------------------- 17:21:20 sqlite> |
Если посмотрим текущий формат даты начала обучения в таблице по потокам, то увидим, что он не соответствует стандартному формату.
sqlite> SELECT start_date FROM streams; start_date ---------- 18.08.2020 02.10.2020 12.11.2020 sqlite> |
Привести данные к подходящему виду позволит функция SUBSTRING (сокращённо — SUBSTR), вырезающая часть строки.
Чтобы понять, как работает эта функция, рассмотрим сначала простой пример. Пусть из текущей даты, которая получена функцией CURRENT_TIMESTAMP, нам надо получить только год.
|
|
sqlite> SELECT CURRENT_TIMESTAMP; CURRENT_TIMESTAMP ------------------- 2021-01-10 09:39:37 sqlite> |
Определим, в каких позициях символов находится значение года — год начинается с позиции 1, и вырезать потребуется 4 символа. Тогда для получения подходящего значения надо воспользоваться выражением SUBSTR(CURRENT_TIMESTAMP, 1, 4):
sqlite> SELECT SUBSTR(CURRENT_TIMESTAMP, 1, 4); SUBSTR(CURRENT_TIMESTAMP, 1, 4) ------------------------------- 2021 sqlite> |
То есть первым аргументом функции SUBSTR мы задаём строку, которую хотим обработать, вторым — позицию первого символа требуемой нам подстроки. Третьим аргументом определяем количество символов.
Применим аналогичный подход, чтобы преобразовать даты начала занятий таблицы, относящейся к потокам так, как нам надо. Вырежем:
● сначала год — начинается с символа 7 длиной 4 символа;
● затем месяц — начинается с символа 4 длиной 2 символа;
● и дату — начинается с символа 1 длиной 2 символа.
Чтобы объединить все части даты нового формата в одну строку, применяем в качестве оператора конкатенации две вертикальных черты ||:
sqlite> SELECT SUBSTR(start_date, 7, 4) || '-' || SUBSTR(start_date, 4, 2) || '-' || SUBSTR(start_date, 1, 2) FROM streams; 2020-08-18 2020-10-02 2020-11-12 sqlite> |
Пример выше покажет даты в требуемом формате на экране, но в таблице формат её хранения не изменится. Чтобы внести изменения, скомпонуем команду на обновление UPDATE, используя то же выражение для замены значения в столбце start_date:
sqlite> UPDATE streams SET start_date = SUBSTR(start_date, 7, 4) || '-' || SUBSTR(start_date, 4, 2) || '-' || SUBSTR(start_date, 1, 2); sqlite> SELECT * FROM streams; id number course_id start_date ---------- ---------- ---------- ---------- 1 45 2 2020-08-18 2 48 3 2020-10-02 3 54 1 2020-11-12 sqlite> |