Части текста
Часто нужна только часть текста: год из даты, первые буквы имени, домен из адреса почты. SUBSTR(text, start, length) (от «substring», подстрока) вырезает length символов, начиная с символа на позиции start. Позиции считаются с 1:
SELECT SUBSTR('Dragon Forge', 1, 6) AS first_word, SUBSTR('Dragon Forge', 8) AS rest;| first_word | rest |
|---|---|
| Dragon | Forge |
Без третьего аргумента SUBSTR идёт до конца текста. А поскольку даты — это тексты, SUBSTR(released, 1, 4) — это год выхода игры, а SUBSTR(released, 6, 2) — месяц.
INSTR(text, part) находит, где в тексте находится его часть: возвращает позицию, с которой она начинается, или 0, если в тексте её нет. INSTR('emma.clark@mail.com', '@') равно 11. Вместе с SUBSTR она позволяет разрезать текст по символу, где бы он ни стоял. Имя пользователя в адресе почты — это всё до знака @:
SELECT email,
INSTR(email, '@') AS at_position,
SUBSTR(email, 1, INSTR(email, '@') - 1) AS username
FROM customers
ORDER BY id
LIMIT 3;| at_position | username | |
|---|---|---|
| emma.clark@mail.com | 11 | emma.clark |
| liam.t@mail.com | 7 | liam.t |
| olivia@brownfamily.net | 7 | olivia |
Читайте последний столбец изнутри наружу: INSTR находит @, - 1 отступает на один символ назад, а SUBSTR берёт столько символов с начала.
REPLACE(text, old, new) заменяет каждое вхождение одного текста другим. Для своих хештегов магазин убирает пробелы из названий, заменяя их пустым текстом:
SELECT title, '#' || REPLACE(title, ' ', '') AS hashtag
FROM games
LIMIT 3;| title | hashtag |
|---|---|
| Dragon Forge | #DragonForge |
| Pixel Racer | #PixelRacer |
| Moon Farm | #MoonFarm |
TRIM(text) убирает пробелы в начале и в конце текста; LTRIM и RTRIM убирают их только слева или только справа. Данные магазина аккуратны, но тексты, которые люди вводят в формах, часто нет, а 'Moon Farm ' не равно 'Moon Farm'. Чтобы увидеть пробелы, возьмите текст в скобки:
SELECT '[' || ' Moon Farm ' || ']' AS untrimmed,
'[' || TRIM(' Moon Farm ') || ']' AS trimmed;| untrimmed | trimmed |
|---|---|
| [ Moon Farm ] | [Moon Farm] |
Со вторым аргументом TRIM убирает не пробелы, а другие символы: TRIM('...Wow!!', '.!') — это Wow.
Типичная ошибка: счёт с 0, как во многих языках программирования. SUBSTR(released, 0, 4) даёт всего три символа, например 202, потому что позиция 0 находится до начала текста. В SQL первый символ стоит на позиции 1.
Задание
- 1
Каждая игра получает код для склада: первые три буквы названия заглавными, дефис и её ID, например
DRA-1. Покажите код какcodeи название, отсортировав по ID:code title DRA-1 Dragon Forge PIX-2 Pixel Racer MOO-3 Moon Farm … … - 2
Ниже покажите имя каждого клиента и домен его почты, то есть всё после @, как
domain. Отсортируйте клиентов по ID:name domain Emma Clark mail.com Liam Turner mail.com Olivia Brown brownfamily.net … … - 3
А для адресов страниц магазина покажите название каждой игры и её
slug: название строчными буквами, с дефисами вместо пробелов, напримерdragon-forge. Отсортируйте игры по названию:title slug Bakery Story bakery-story Castle Siege castle-siege Cube Logic cube-logic … …