Mit einer case-Anweisung in einer check-Einschränkung
i ' V wurde das erlernen von SQL für die Letzte Woche, aber ich bin unsicher, wie man richtig fügen Sie eine case-Anweisung innerhalb einer check-Einschränkung. Kann jemand mir ein paar Hinweise geben?
Habe ich die folgende Klasse Tabelle:
CREATE TABLE Grade
(
salary_grade char(1) NOT NULL CHECK (salary_grade = UPPER(salary_grade)),
CONSTRAINT ck_grade_scale CHECK(
CASE
WHEN salary_grade = '[A-D]'
THEN salary_scale = 'S1'
WHEN salary_grade = '[D-G]'
THEN salary_scale = 'S2'
END)
salary_scale char(2) DEFAULT 'S1' NOT NULL,
CONSTRAINT pk_grade PRIMARY KEY (salary_grade),
CONSTRAINT ck_salary_grade CHECK (REGEXP_LIKE(salary_grade, '[A-G]', 'c')),
--constraint must be either S1 or S2
CONSTRAINT ck_salary_scale CHECK (salary_scale IN ('S1', 'S2'))
);
Ich soll prüfen, dass wenn der salary_grade
ist zwischen A-D, dann die salary_scale
muss 'S1' oder wenn die salary_grade
ist zwischen E-G dann ist es 'S2'.
Habe ich versucht, dies zu erforschen und sich mit dem letzteren, aber doch es funktioniert nicht.. habe ich strukturiert der code korrekt?
- Bekommst du irgendeine Fehlermeldung? Wenn dem so ist, aktualisieren Sie Ihre Frage, es kann Hilfe bei der Suche nach dem problem.
- Sousa ich bin immer eine Rechte Klammer fehlt, wenn Sie versuchen zu fallen. Außerdem sagt die Tabelle nicht vorhanden ist
- Ich bin wirklich neu in diesem, nur angefangen zu lernen, dass dies ein paar Wochen, so bitte Geduld mit mir
- In der Regel, sollten Sie nicht verwenden
CASE
wo die Boolesche Logik ist erlaubt (z.B.WHERE
Klauseln und check-Einschränkungen). Gebrauch ist, um Ihnen zu erlauben Boolesche Logik zu verwenden, wo es normalerweise nicht erlaubt (z.B. die Spaltenliste inSELECT
Aussagen). - Sie haben bereits 3 gute Antworten. Sollte man Ihnen Kredit durch die Annahme der einen, die Ihren Bedürfnissen am besten passt.
- Ich bin traurig, dass ich völlig vergaß, dies zu tun und ich Schätze all die Hilfe.
- Danke Jungs - das ist eine große Lernkurve
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denke ich, kann man Folgendes tun:
Siehe SQL Fiddle-schema hier.
Brauchen Sie nicht die
UPPER()
Einschränkung aufsalary_grade
da die regex-Prüfung ausreichen (Sie sind bereits überprüfen, um sicherzustellen, dass es ein Großbuchstabe zwischen A und G). Ich glaube nicht, dass die Einschränkung aufsalary_scale
allein ist notwendig, da es enthalten ist, logisch, in den letzten Einschränkung.UPDATE
Ist hier, wie Sie könnten, tun Sie es mit einem
CASE
Aussage:Siehe SQL Fiddle-schema hier.
salary_grade
allein ist nicht wirklich notwendig, dack_grade_scale
deckt das auch.ELSE
imCASE
. Streng genommen auch ein regex ist wahrscheinlich teurer als man möchte;BETWEEN
ist besser.Einen
case
werden im Vergleich zu etwas, das ist, warum Sie immer die fehlende Rechte Klammer Fehler. Es sei denn, Sie wollen, dass vor allem einecase
können Sie überprüfen gerade die Kombination mit und/oder:SQL Fiddle demo.
Als Parado hat gesagt, Sie können nicht die Verwendung von constraints auf Spalten -) Werte setzen bedingt, nur auf Sie beschränken. Sie könnten möglicherweise nutzen eine virtuelle Spalte für die Waage, aber es würde bedeuten, einen Teil der look-up-Tabelle in der DDL, anstatt die Daten, die scheint ein bisschen seltsam.
CASE
.Check Constraints
wird verwendet, um test-Daten, bevor Sie einfügen, um Daten zu schützen Struktur von fake-Daten. Tatsächlich verwenden wircase
imselect
- Anweisung. Sie können es nicht verwenden, für das bedingte einfügen. Wenn Sie ändern möchten, Daten für eine bestimmte Spalte vor dem einfügen müssen Sie mittrigger
oder Sie können auchvirtual column
aber einige Einschränkungen hat.Mehr Informationen finden Sie hier
CONSTRAINT ck_grade_scale CHECK((salary_grade BETWEEN 'A' AND 'D' AND salary_scale = 'S1') OR (salary_grade BETWEEN 'D' AND 'G' AND salary_scale = 'S2'))