|
@@ -210,3 +210,98 @@ select email from employees
|
|
where extract('month' from birthday)=4
|
|
where extract('month' from birthday)=4
|
|
order by email;
|
|
order by email;
|
|
|
|
|
|
|
|
+-- -----------------------------------------------------------------
|
|
|
|
+-- 11.31 Работа с массивами
|
|
|
|
+
|
|
|
|
+drop table if exists log;
|
|
|
|
+table log;
|
|
|
|
+
|
|
|
|
+create temp table log (
|
|
|
|
+ log_id bigint generated always as identity,
|
|
|
|
+ created_at timestamp not null default current_timestamp,
|
|
|
|
+ messages text not null
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+insert into log (created_at, messages) values(
|
|
|
|
+ '2024-08-01 00:47:28.821', 'кажется, всё пропало|или нет, пытаемся восстановить связь|нет, точно всё пропало'
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+insert into log (created_at, messages) values(
|
|
|
|
+ '2024-08-01 01:06:21.581', 'id=128|ничоси, опять всё сломалось, никогда такого не было и вот опять'
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+select log_id, created_at, (string_to_array(messages, '|'))
|
|
|
|
+[array_length(string_to_array(messages, '|'), 1)] as last_message
|
|
|
|
+from log;
|
|
|
|
+
|
|
|
|
+select log_id, created_at,
|
|
|
|
+ split_part(messages, '|', array_length(string_to_array(messages, '|'), 1)) as last_message
|
|
|
|
+from log;
|
|
|
|
+
|
|
|
|
+select log_id, created_at, split_part(messages, '|', -1) as last_message from log;
|
|
|
|
+
|
|
|
|
+--
|
|
|
|
+select unnest(string_to_array(messages, '|')) as messages from log;
|
|
|
|
+
|
|
|
|
+select int_array from some_entity where 777=any(int_array);
|
|
|
|
+
|
|
|
|
+select unnest(string_to_array(messages, '|')) from log;
|
|
|
|
+
|
|
|
|
+select unnest as messages from (select unnest(string_to_array(messages, '|')) from log)
|
|
|
|
+where unnest like '%всё%';
|
|
|
|
+
|
|
|
|
+-- более короткое решение
|
|
|
|
+select t.* from (
|
|
|
|
+ select unnest(string_to_array(messages, '|') messages
|
|
|
|
+ from log
|
|
|
|
+) t where t.messages '%всё%';
|
|
|
|
+
|
|
|
|
+-- -----------------------------------------------------------------
|
|
|
|
+-- 11.33 Работа с JSON и JSONB
|
|
|
|
+
|
|
|
|
+drop table if exists book_json;
|
|
|
|
+
|
|
|
|
+create temp table book_json (
|
|
|
|
+ book_id bigint generated always as identity primary key,
|
|
|
|
+ data jsonb not null
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+-- Данные в поле data (jsonb) могут различаться
|
|
|
|
+insert into book_json (data) values
|
|
|
|
+ ('{"name": null}'),
|
|
|
|
+ ('{"name": ""}'),
|
|
|
|
+ ('{"name": "Тихий Дон"}'),
|
|
|
|
+ ('{"name": 777}'),
|
|
|
|
+ ('{}');
|
|
|
|
+
|
|
|
|
+table book_json;
|
|
|
|
+
|
|
|
|
+select book_id, data from book_json where data ? 'name';
|
|
|
|
+
|
|
|
|
+select book_id, data from book_json where data->>'name' is not null;
|
|
|
|
+
|
|
|
|
+select book_id, data from book_json where length(data->>'name') > 0;
|
|
|
|
+
|
|
|
|
+-- или вот такой вариант
|
|
|
|
+select * from book_json
|
|
|
|
+where data->>'name' is not null and data->>'name' != '';
|
|
|
|
+
|
|
|
|
+-- Создание таблицы с ограничениями по jsonb
|
|
|
|
+create table book_json(
|
|
|
|
+ book_id bigint generated always as identity primary key,
|
|
|
|
+ data jsonb not null check (
|
|
|
|
+ data->>'name' is not null and
|
|
|
|
+ data->>'pages' is not null and
|
|
|
|
+ (data->>'pages')::int > 0
|
|
|
|
+ )
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|