|created |
--------|--------|-------------------|-------------------|
1| 6|2020-11-16 18:29:30|2020-11-16 18:29:30|
1| 5|2020-11-16 18:29:30|2020-11-16 18:29:30|
1| 4|2020-11-16 18:29:30|2020-11-16 18:29:30|
3| 3|2020-11-16 18:29:30|2020-11-16 18:29:30|
3| 2|2020-11-16 18:29:30|2020-11-16 18:29:30|
3| 1|2020-11-16 18:29:30|2020-11-16 18:29:30|
3| 5|2020-11-16 19:56:33|2020-11-16 19:56:33|
как проверить есть ли нужная мне пара в таблице?
https://www.w3schools.com/sql/sql_exists.asp
сделал через count(*) теперь не могу триггер настроить. вообще ни одного нотиса не выводит CREATE OR REPLACE FUNCTION check_compatibility_phone_cable() RETURNS TRIGGER AS $$ DECLARE -- Declare aliases for user input. -- Declare a variable exist_var INTEGER; BEGIN SELECT INTO exist_var count(*) from cable_possible where id_phone = new.id_phone AND id_cable = new.id_cable; IF exist_var = 0 THEN RAISE NOTICE 'Телефон и провод не совместимы'; END IF; IF exist_var > 0 THEN RAISE NOTICE 'Ура, телефон и провод совместимы'; END IF; RETURN NEW; END; $$language plpgsql; CREATE TRIGGER check_compatibility_phone_cable BEFORE UPDATE ON Orders FOR EACH ROW EXECUTE PROCEDURE check_compatibility_phone_cable();
А Вы лучше покажите SQLfiddle (и проблема будет найдена в процессе подготовки, скорее всего ;) )... а почему триггер [только] на UPDATE (он, с виду, больше для вставки подходит)? > сделал через count(*) (Ехидно) А вот Вы, чтобы узнать, например, есть ли ложки на столе, всегда их все пересчитываете, а потом делаете вывод? ;) Т.е. есть же EXISTS, зачем COUNT?
я пробовал exist, но так и не понял как он работает. написано возвращает тру, но у меня почему то 3 возвращал когда я его в переменную писал. сейчас обновил с UPDATE на INSERT и заработало. я этот кусок с другого своего тригера скопипровал и даже не заметил что там менять надо, спасибо.
> я пробовал exist, но так и не понял как он работает. Так, как написано. > у меня почему то 3 возвращал когда я его в переменную писал. Покажите код.
сейчас напишу снова, минутку. я его уже удалил
Ну, покажи код...
CREATE OR REPLACE FUNCTION check_compatibility_phone_cable() RETURNS TRIGGER AS $$ DECLARE -- Declare aliases for user input. -- Declare a variable exist_var BOOLEAN := f; BEGIN exist_var := EXISTS (SELECT * FROM cable_possible WHERE id_phone = new.id_phone AND id_cable = new.id_cable); IF exist_var = f THEN RAISE NOTICE 'Телефон и провод не совместимы'; END IF; IF exist_var = t THEN RAISE NOTICE 'Ура, телефон и провод совместимы'; END IF; RETURN NULL; END; $$language plpgsql;
exist_var := select case when EXISTS (SELECT * FROM cable_possible WHERE id_phone = new.id_phone AND id_cable = new.id_cable) then t else f end;
ERROR: syntax error at or near "select" LINE 12: exist_var := select case when EXISTS (SELECT * FROM cable_po... ^ SQL state: 42601 Character: 200
Возможно , присваивание не так пишется, этого я не знаю как оно в PG.
Может быть select exist_var := case when EXISTS (SELECT * FROM cable_possible WHERE id_phone = new.id_phone AND id_cable = new.id_cable) then true else false end;
s/f/false/ s/t/true/ И зачем писать "IF boolean_variable = true", когда можно просто "IF boolean_variable"? Ну и так далее...
о, Ярослав , ты же точно знаешь, как присваивание из запроса в PL
select case when EXISTS (SELECT * FROM cable_possible WHERE id_phone = new.id_phone AND id_cable = new.id_cable) then t else f end INTO exist_var;
Может и так , да
Оба варианта работают (":=" и "="), никакие CASE не нужны (EXISTS же возвращает boolean).
И его можно просто в выражении писать, без SELECT ?
Да. См. https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-ASSIGNMENT
ок, не знал.. Да я и вообще не знаю PG PL
Я так понимаю, что он в существенной степени "содран" c PL/SQL (Oracle). В документации даже есть вот такой раздел: https://www.postgresql.org/docs/current/plpgsql-porting.html
Ну всё равно непохоже.
ERROR: column "t" does not exist LINE 1: ... = new.id_phone AND id_cable = new.id_cable) then t else f e... ^ QUERY: select case when EXISTS (SELECT * FROM cable_possible WHERE id_phone = new.id_phone AND id_cable = new.id_cable) then t else f end CONTEXT: PL/pgSQL function check_compatibility_phone_cable() line 11 at SQL statement SQL state: 42703
исправьте f на false и t на true и будет вам счастье
спасибо, я думал f и t это сокращения, видел в каком-то примере. NOTICE: Ура, телефон 5 и провод 1 совместимы INSERT 0 0
Обсуждают сегодня