CREATE OR REPLACE FUNCTION set_employee_status()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
DECLARE curr_row RECORD;
BEGIN
IF tg_op = 'INSERT' OR tg_op = 'UPDATE' THEN -- проверяем допустимые операции
IF NEW is null THEN -- выбираем NEW/OLD строку
curr_row := OLD;
ELSE
curr_row := NEW;
END IF;
IF curr_row.date_start <= CURRENT_DATE and curr_row.date_end >= CURRENT_DATE THEN
update employee -- тут изменяется таблица работников!
set empoyee_status = 1
where emp_id = curr_row.employee_id;
ELSE
update employee -- тут изменяется таблица работников!
set empoyee_status = 0
where emp_id = curr_row.employee_id;
END IF;
END IF;
RETURN NEW;
END;
$$
CREATE TRIGGER tr_set_employee_status
BEFORE UPDATE
ON vocation -- тут на таблицу отпусков вешается триггер!
FOR EACH ROW
EXECUTE PROCEDURE set_employee_status();
select trunc(payment_date) as p_date, sum(amount) as daily_income
from payment
where extract(month from payment_date) = 7
and extract(year from payment_date) = 2005 -- про extract - тоже нужно смотреть, как это принято в конкретном диалекте SQL
group by trunc(payment_date)
order by p_date desc
...
count(
case
when p.id = ANY (
SELECT prod_id
FROM "Product_properties" pp
WHERE pp.attr_alias = 'ram' AND pp.option_alias IN ('2gb','3gb','4gb','8gb')
)
AND
p.id = ANY (
SELECT prod_id
FROM "Product_properties" pp
WHERE pp.attr_alias = 'storage' AND pp.option_alias IN ('16gb','128gb')
)
then 1
end
)
...
SET QUOTED_IDENTIFIER ON;
-- create
CREATE TABLE entity (
xml ntext
);
-- insert
INSERT INTO entity(xml) VALUES ('<r><authCard>abc123slip4</authCard><authCard>abc1234</authCard></r>');
-- fetch
SELECT * FROM entity
where cast(xml as xml).value('(/r/authCard)[1]', 'nvarchar(max)') LIKE N'%slip%';
-- Тестовая выборка
with t as (select to_date('2024-09-17 11:52:17', 'yyyy-mm-dd hh24:mi:ss') begin_date, to_date('2024-12-17 11:52:17', 'yyyy-mm-dd hh24:mi:ss') end_date, 3 Cnt from dual union
select to_date('2024-06-10 14:52:19', 'yyyy-mm-dd hh24:mi:ss') begin_date, to_date('2024-07-10 14:52:19', 'yyyy-mm-dd hh24:mi:ss') end_date, 1 Cnt from dual)
-- Иерархический запрос
select distinct T.*,
add_Months(T.Begin_Date, Level - 1) as Current_Date, -- отсчет месяцев
Level as Current_Val -- текущее значение отсчета
from T
CONNECT BY add_Months(T.Begin_Date, Level) <= T.End_Date
order siblings by T.Begin_Date desc
select *
from cst
where exists( select *
from cst_stat
where cst.id = cst_stat.cst_id
and cst_stat.p_key = 5 and cst_stat.p_value = 1.5
) -- вариант поиска в JSON значения 5: 1.5
select t.*,
(select Cs.Name
from Sender_Template St
join Company_Sender Cs on Cs.Id = St.Company_Id
where t.baza like St.template
limit 1
) as Sender_Name -- если null, значит ни один шаблон не подошел
from t
SELECT concat(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) as COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'info'
AND TABLE_SCHEMA = 'db'
select '[' || ListAgg(item, ',') over (order by rownum) || ']' as item_arr
from table
select user_id,
order_id,
time,
lag(time) over (partition by user_id order by order_id) as before_time, -- предыдущее значение time в пределах user_id по сортировке order_id
time - lag(time) over (partition by user_id order by order_id) as period, -- математика вычитания времени зависит от СУБД.
max(time) over (partition by user_id) - min(time) over (partition by user_id) as user_period -- период между самой ранней записью по пользователю и самой поздней записью по пользователю
from t
while($row=mysqli_fetch_array($res))
{
// #########################
// #### начало тела цикла #####
// ##########################
$iduser=$id;
$idkat=$row['idkat'];
// #########################
// #### конец тела цикла #####
// ##########################
}
$res=mysqli_prepare($bd, "INSERT INTO zakaz (iduser,idkat)
VALUES(?,?)");
mysqli_stmt_bind_param($res, 'ii', $iduser,$idkat); // подставляем переменные, которые присвоились на ПОСЛЕДНЕМ прогоне цикла
$result2=mysqli_stmt_execute($res);
while($row=mysqli_fetch_array($res))
{
// #########################
// #### начало тела цикла #####
// ##########################
$iduser=$id;
$idkat=$row['idkat'];
$res2=mysqli_prepare($bd, "INSERT INTO zakaz (iduser,idkat)
VALUES(?,?)");
mysqli_stmt_bind_param($res2, 'ii', $iduser,$idkat); // подставляем переменные, которые присвоились на ТЕКУЩЕМ прогоне цикла
$result2=mysqli_stmt_execute($res2);
// #########################
// #### конец тела цикла #####
// ##########################
}