Wie kann ein Array mittels Domain oder Funktion validiert werden?

hallo,

ich möchte bei Eingabe eines Array-Wertes in eine Tabelle nur bestimmte Werte zulassen. Um das zu validieren benötige ich also eine DOMAIN oder FUNKTION.

Angenommen es gibt ein Attribut Namens axisdirlists mit dem Datentyp text[].
Dazu habe ich folgende DOMAIN, die die eingegebenen Werte über folgenden regulären Ausdruck überprüfen soll.

CREATE DOMAIN AxisDirectionList AS text[] CHECK(
        VALUE[0] ~ '[\+\-][1-9][0-9]*'
);

In diesem Fall wird nur der erste Wert im text-Array überprüft. Wie kann ich alle überprüfen. Ich denke, dass man in eine DOMAIN keine FOR-Schleife setzen kann, also brauche ich wohl doch eine FUNKTION.

für eure Hilfe wäre ich sehr dankbar

gruß jazzhunter

Wenn ich mich recht erinnere, habe ich Dir erst vor wenigen Tagen eine Check-Funktion gezeigt, oder?


Andreas

Sollte diese “directory list” nicht lieber in eine extra Tabelle? Kling für mich danach als wäre da was nicht sauber normalisiert.

ja das ist wohl war…

ich hab mir diese Funktion gebastelt…

CREATE OR REPLACE FUNCTION check_input(text[]) returns bool AS
$$BEGIN 
    FOR i in 0..array_upper($1,1) LOOP
        if $1[i] ~ '[\+\-][1-9][0-9]*' then return true;
        else return false;
        end if;
        END LOOP;
END;
$$language plpgsql;

aber da ist noch ein fehler drin…
wenn ich das richtig verstanden habe enthält doch der 2. Parameter bei der Funktion array_upper die Dimension, nicht wahr? …in der Referenz wird das nicht deutlich

gruß jazzhunter

Ähm, ja. Vielleicht noch prüfen, wie die Dimensionen des Arrays sind: array_ndims().

Anstall der Schleife würde ich vielleicht mit unnest() arbeiten.


Natürlich kann/sollte man auch prüfen, ob ein ARRAY wirklich sinnvoll ist. Aber das wurde ja auch schon gesagt.


Andreas

ok danke,

ich habe nun auch aufgrund der Normalisierung doch eine neue Tabelle erstellt…

gruß jazzhunter