Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
CREATE FUNCTION invert_char(s text) RETURNS text AS $$
SELECT CASE WHEN s ~ '[[:upper:]]' THEN lower(s) ELSE upper(s) END;
$$ LANGUAGE sql;
SELECT string_agg(invert_char(t),'')
FROM regexp_split_to_table(initcap('иВАнОв ИВан иВановиЧ'),'') AS t;
Да, здорово!
Выходит, что в данном примере не обязательно выводить порядок для string_agg? Чтобы ничего не сдвинулось без принудительной сортировки.
Можно еще для инвертирования регистра использовать функцию translate, тогда решением бонусного задания будет:
select translate(initcap(‘иВАнОв ИВан иВанович’),’АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзиклмнопрстуфхцчшщьыъэюя’,‘абвгдеёжзиклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ‘) as t;SELECT reverse(substring(reverse('start long striiing 12345 end') for 10));
SELECT replace(replace(replace('s p a c e', ' ', '<>'), '><', ''), '<>', ' ');Case можно и в запрос вставить, но Постгрес с этим, к счастью, сам справляется.
select
array_to_string(array_agg(substring(a from 1 for 1) || upper(substring(a from 2))), ' ')
from
(select unnest(string_to_array(lower('иВАнОв ИВан иВановиЧ'), ' ')) as a) tSELECT current_date + 1. Другое дело, что в Постгресе это смотрится как кривоватое исключение, сделанное совместимости ради. Интервалы гораздо приятнее, на самом деле.SELECT CAST((now()+ INTERVAL '1 DAY') AS DATE)- заменю DAY на (week, month, year и т.д.)
- заменю +1 на -9000
- заменю DATE на TIME
- уберу CAST
- оставлю только NOW()
и т.д. "Не представляю, для чего может пригодиться считать количество ЗАГЛАВНЫХ (английских) букв?"В MySQL и SQL Server нет такой х**ни как целый числа в операциях, поэтому SELECT 3/2 выдает как положено 1.5. Если в Postgre это не так — в голову гвоздь забить разрабу, который это придумал.
2.3 NOW() на сколько я знаю, во ВСЕХ языках возвращает не дату, а дату и время. Дату всегда возвращает функция с текстом DATE в названии (в MySQL это CURDATE()). У любой функции в любом языке есть значение инкремента по умолчанию — для CURDATE это 1 день. Поэтому, запрос следующего дня всегда будет SELECT CAST(CURDATE() + 1 AS DATE) без всяких указаний интервалов и прочей чепушины.
-- Имеется таблица с двумя строками
CREATE TABLE goods (discount) AS
(SELECT 10::INT
UNION ALL
SELECT 15);
-- 1. User_1 выполняет запрос (транзакция остается открыта):
BEGIN;
UPDATE goods
SET discount = discount + 5;
--2. User_2 выполняет запрос:
UPDATE goods
SET discount = discount + 100
WHERE discount = 15
--3. User_1 выполняет
COMMIT;
Задачи и решения для бойца PostgreSQL