na jednej z list postgresowych jakiś koleś zamarudził, że o ile warunek:
where pole!=3
działa poprawnie, to już
where pole!=-3 nie działa poprawnie.
wiele osób mu wyjaśniło, że:
- standard sql nie oferuje operatora != w ogóle. do tego jest <>
- != w postgresie to dodatek. takie “nice to have"
- gdy doda się spację między “!=" a “-3" to działa ok (where pole!= -3)
- całość działa tak dlatego, że system nie ma jak rozróżnić czy chodzi o “pole" “!=" “-3" czy może “pole" “!=-" “3", a to drugie jest w pełni legalną nazwę operatora – którego domyślnie nie ma, ale może być – w końcy postgres ma architekturę mocno otwartą i można sobie dodefiniować własne operatory czy cokolwiek.
facet oczywiście marudził dalej, że powinno działa.
postanowiłem pomóc. jak? dopisać operator !=- który zadziała tak jak facet chce.
najpierw potrzebna była funkcja. 30 sekund później miałem:
CREATE FUNCTION not_equals_minus(int8, int8) RETURNS bool AS $BODY$ SELECT $1 <> -$2; $BODY$ LANGUAGE SQL IMMUTABLE STRICT;
proste i szybkie. działa dla liczb typu int8 (bigint), ale przerobienie do innych typów to trywiał.
to teraz definiojemy operator. jak? nie pamiętam. ale szybki search w manualu dał mi odpowiednią stronę, z jej pomocą napisałem:
CREATE OPERATOR !=- ( leftarg = int8, rightarg = int8, PROCEDURE = not_equals_minus, commutator = !=- );
efekt? działa. można teraz zrobić WHERE pole <> -3, WHERE pole != -3, lub WHERE pole!=-3. kocham postgresa 🙂