CASE WHEN in Triggern möglich?

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
Benutzeravatar
martin.koeditz
Beiträge: 121
Registriert: Sa 31. Mär 2018, 14:35

Do 19. Sep 2019, 13:55

Hallo zusammen,

kann ich Fallunterscheidungen mittels CASE WHEN in Triggern nutzen? Ich versuche etwas in dieser Art:

Code: Alles auswählen

CREATE OR ALTER TRIGGER TBL_DOC_NUMBER_BIU FOR TBL_DOC ACTIVE
BEFORE INSERT OR UPDATE POSITION 10000
AS
BEGIN
	CASE NEW.DOC_TYPE_ID
        	WHEN 100 THEN NEW.ITEM_INTERNAL_NO = 'xyz';
        	WHEN 200 THEN NEW.ITEM_INTERNAL_NO = 'abc';
        	WHEN 300 THEN NEW.ITEM_INTERNAL_NO = 'def;
                ELSE NEW.ITEM_INTERNAL_NO = null;                    
END			            
Dank und Gruß
Martin
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 117
Registriert: Mo 7. Mai 2018, 18:09

Do 19. Sep 2019, 17:01

Ich sehe da nun keinen Hinderungsgrund, da ja bis auf wenige Ausnahmen alle SQL's erlaubt sind.
Allerdings sollte schon die Zuweisung erkennbar sein, denn so erzeugst du nur einen True-Wert, der verloren geht:

[set] :NEW.ITEM_INTERNAL_NO =
CASE NEW.DOC_TYPE_ID
WHEN 100 THEN 'xyz';
WHEN 200 THEN 'abc';
WHEN 300 THEN 'def;
ELSE null
END;
Benutzeravatar
martin.koeditz
Beiträge: 121
Registriert: Sa 31. Mär 2018, 14:35

Fr 20. Sep 2019, 11:34

Hi bfuerchau,

ich Trottel habe mein Anliegen falsch dargestellt. Ich probiere es nochmal:
CREATE OR ALTER TRIGGER TBL_DOC_NUMBER_BIU FOR TBL_DOC ACTIVE
BEFORE INSERT OR UPDATE POSITION 10000
AS
BEGIN
CASE NEW.DOC_TYPE_ID
WHEN 100 THEN
UPDATE TBL_DOC_NO SET NEW.ITEM_INTERNAL_NO = 'xyz' WHERE DOC_TYPE_ID = 100;
WHEN 200 THEN
UPDATE TBL_DOC_NO SET NEW.ITEM_INTERNAL_NO = 'abc' WHERE DOC_TYPE_ID = 200';
WHEN 300 THEN
UPDATE TBL_DOC_NO SET NEW.ITEM_INTERNAL_NO = 'def' WHERE DOC_TYPE_ID = 300;
ELSE
UPDATE TBL_DOC_NO SET NEW.ITEM_INTERNAL_NO = null WHERE DOC_TYPE_ID = 999;
END
Bitte nicht auf die inhaltliche Logik achten. Mir geht es nur darum, ob es ein Konstrukt gibt, mit dem ich die Statements fallabhängig ausführen kann. Alternativ könnte ich natürlich IF-Klauseln verwenden. Bei mehreren Fallunterscheidungen ist ein Switch Case übersichtlicher.

Dank und Gruß
Martin
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 117
Registriert: Mo 7. Mai 2018, 18:09

Fr 20. Sep 2019, 15:23

Dafür gibt es doch tatsächlich den IF-Befehl:
https://www.firebirdsql.org/pdfmanual/h ... loops.html
Antworten