Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wykrywanie zakresow liczb
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
vailor
Jak mozna wykryc zachodzenie na siebie zakresow liczb.

Mam tablice w ktorej ustalam zakresy numerow dla danych obiektow, przy dodawaniu nowego obiektu musze sprawdzic czy zakres nie pokrywa sie z innym zakresem

np.

tbl.obj='Obiekt1'; tbl.od = 1; tbl.do = 5

wstawiam nastepny obiekt

tbl.obj='Obiekt2'; tbl.od = 3; tbl.do = 5

odrzuca

tbl.obj='Obiekt2'; tbl.od = 6; tbl.do = 9

przyjmuje.


Jedyne co mo przychodzi do glowy to BETWEEN ale to az 4 warunki musial bym zalozyc wiec mysle ze jest prostrzy sposob tylko go nie znam:). Moze jakas funkcja zblizona do OVERLAPS...

Dzieki za wszelkie sugestie
MStaniszczak
A może tak (po co 4 warunki? może czegoś nie zrozumiałem lub coś źle kombinuje):

Tabela:
  1. CREATE TABLE test (
  2. _object VARCHAR(255),
  3. _od INTEGER NOT NULL,
  4. _do INTEGER NOT NULL
  5. );


Funkcja (trigger):
  1. CREATE OR REPLACE FUNCTION insert_test() RETURNS TRIGGER AS '
  2. DECLARE
  3. __object test._object%TYPE;
  4. BEGIN SELECT
  5. INTO __object _object
  6. FROM test WHERE (NEW._od BETWEEN _od AND _do) OR (NEW._do BETWEEN _od AND _do);
  7. IF NOT FOUND THEN
  8. RETURN NEW;
  9. ELSE
  10. RAISE EXCEPTION ''Zakres pokrywa się!'';
  11. END IF;
  12. END;
  13. ' LANGUAGE 'plpgsql';


Tworzenie wyzwalacza na instrukcje instert oraz update:
  1. CREATE TRIGGER trig_insert_test BEFORE INSERT OR UPDATE ON test FOR EACH ROW
  2. EXECUTE PROCEDURE insert_test();


Testowałem na:
  1. INSERT
  2. INTO test VALUES ('Object1', 1, 5); --OK
  3. INSERT
  4. INTO test VALUES ('Object2', 3, 5); --ERROR: Zakres pokrywa się!
  5. INSERT
  6. INTO test VALUES ('Object3', 3, 9); --ERROR: Zakres pokrywa się!
  7. INSERT
  8. INTO test VALUES ('Object4', 6, 9); --OK


Pozdrawiam
Marcin Staniszczak
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.