Текстови функции
Накратко: В SQLite текстовите функции слепват текст с ||, мерят дължината му с LENGTH, режат го със SUBSTR, търсят в него с INSTR и го чистят с REPLACE и TRIM.
Проблем
Етикетите на рафта
Магазинът печата етикети за рафтовете: името на продукта и цената, като „Бял хляб (1,20 €)“. Името е в една колона, цената в друга. Трябва ти една колона с готовия текст, за да я пратиш направо на принтера.
Идеята
Слепване с ||
|| слепва текст. Парчетата може да са колони, текст в кавички или числа:
Почти. Числото се превръща в текст от само себе си, но в най-краткия си вид: 1.2, с точка и без нулата. За етикет трябват две цифри и запетая.
printf('%.2f', price) пише числото с точно две цифри след точката: 1.20. REPLACE(текст, какво, с какво) сменя точката със запетая:
Функциите се влагат една в друга: REPLACE получава готовия текст от printf.
По-точно, за любопитните
printf е функция на SQLite. От версия 3.38 тя се казва и format. В PostgreSQL за същото има to_char(price, 'FM990.00'), а в MySQL FORMAT(price, 2). Ако страницата е на няколко езика, по-добре е числото да остане число, а програмата, която показва страницата, да го оформи.
Пробвай
Получателят на писмото
Пощенските програми показват адреса като „Мария Иванова <maria.ivanova@example.com>“. Направи такава колона за всеки клиент и я наречи recipient.
Решение
SELECT name || ' <' || email || '>' AS recipient FROM customers;name || ' <' || email || '>' AS recipient. Интервалът преди < е в кавичките, иначе името и адресът се слепват.
Виж го
Един град липсва
Куриерът иска ред „име, град“ за всеки клиент:
Когато колоната може да е NULL, слепеният текст също може да е NULL. Как да сложиш думи на мястото на липсващия град, ще видиш в урока за CASE и COALESCE.
Идеята
Части от текста
Функциите за текст, които ще ползваш най-често:
LENGTH(t): колко знака има.SUBSTR(t, от, колко): парче от текста. Броенето започва от 1.INSTR(t, част): на кое място е частта, или 0, ако я няма.UPPER(t)иLOWER(t): главни и малки букви.REPLACE(t, какво, с какво)иTRIM(t), който маха интервалите в началото и в края.
SUBSTR и INSTR заедно режат текст на точното място. Домейнът на имейла е всичко след @:
TRIM трябва, когато данните идват от формуляр или от електронна таблица и някой е оставил интервал:
Пробвай
Инициали
За картите за отстъпка трябват инициалите на клиента: „М. И.“ за Мария Иванова. Покажи името и инициалите в колона initials.
Решение
SELECT name, SUBSTR(name, 1, 1) || '. ' || SUBSTR(name, INSTR(name, ' ') + 1, 1) || '.' AS initials
FROM customers;Първата буква на името е SUBSTR(name, 1, 1). Фамилията започва след интервала, на място INSTR(name, ' ') + 1, и оттам се взима един знак. Между тях: '. ', накрая '.'.
Виж го
LOWER и кирилицата
Сайтът иска адрес за всеки продукт от вида бял-хляб: малки букви, тире вместо интервал. Пусни:
Тиретата са там, но „Бял“ е с главно „Б“. Вградените UPPER и LOWER в SQLite сменят само латинските букви:
Същото видя при LIKE: за SQLite „Б“ и „б“ са два различни знака. Грешка няма, затова това често се пропуска.
По-точно, за любопитните
PostgreSQL и MySQL с текст в UTF-8 сменят правилно и кирилицата. В SQLite има разширение (ICU), което учи UPPER, LOWER и LIKE на всички азбуки, но в браузъра тук го няма. Затова програмите, които ползват SQLite, често пазят текста за търсене в отделна колона, вече с малки букви, сметнати в програмата.
Упражнение
Две задачи
1. На етикета се побират 15 знака. Кои продукти имат по-дълго име? Покажи името и дължината му в колона length.
Продуктите с име над 15 знака:
Решение
SELECT name, LENGTH(name) AS length FROM products WHERE LENGTH(name) > 15;WHERE LENGTH(name) > 15. Функция може да е и в WHERE, не само в SELECT. Четири продукта, със 17 и 18 знака. Интервалите също се броят.
2. Новата система за вход иска потребителско име: частта от имейла преди @. Покажи имейла и потребителското име в колона username.
Имейлът и потребителското име на всеки клиент:
Решение
SELECT email, SUBSTR(email, 1, INSTR(email, '@') - 1) AS username FROM customers;SUBSTR(email, 1, INSTR(email, '@') - 1). От първия знак, толкова знака, колкото са преди @. Без - 1 ще вземеш и самото @.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: WHERE: филтриране на редове · IN, BETWEEN и LIKE · NULL: няма стойност · Сметки в заявката
- Продължава в: CASE и липсващите стойности · Дървета и редици: WITH RECURSIVE · Бавни заявки · SQL injection и параметрите
- Задачи по темата: Изрази и функции