none
mit if Bedingung Variablen Werte zuweisen RRS feed

  • Frage

  • Hallo an alle,

    ich würde gern eine Bedingung definieren wenn diese erfüllt ist soll einer Variabel ein Wert zugewiesen werden.

    Ich weiß das die Wertzuweisung innerhalb der IF Bedingung nur innerhalb der Bedingung gesetzt wird. Es soll jedoch mein Wusch darstellen.

    DECLARE @Timestamp varchar(30)
    --SET @Timestamp = CONVERT (datetime,'2017-04-23 00:00:00.000', 121);
    SET @Timestamp = '2017-04-23 00:00:00.000';
    
    DECLARE @Timestamp_END varchar(30)
    --SET @Timestamp_END = CONVERT (datetime,'2017-05-30 00:00:00.000', 121);
    SET @Timestamp_END ='2017-05-30 23:59:00.000';
    
    
    DECLARE @Verwendung varchar(30)
    SET @Verwendung = 'Toaster';
    DECLARE @Spaltenauswahl varchar(30);
    
    
    
    BEGIN
    if @Verwendung = 'Toaster' 
    			--SET @Spaltenauswahl = 'Spalte1';
    				print '1'
    		ELSE if @Verwendung = 'Messer'
    			--SET @Spaltenauswahl = 'Spalte2'
    				print '3'
    		
    		
    		
    		END;
    		GO	 
    --print @Spaltenauswahl
    

    Der Hintergrund ist jener das ich stets einen Parameter habe der eine Abfrage steuern soll. Leider muss er bei der Abfrage dann auch andere Spalten zu rate ziehen. Wenn Parameter =1 dann nimm Spalte 3 wenn Parameter = 2 dann nimm Spalte 14 uws.

    Kann mir jemand hierbei helfen?

    Montag, 15. Mai 2017 14:11

Antworten

  • Hallo Toot,

    dafür gibt es CASE, im Falle oben reicht dessen einfache Form:

    SET @Spaltenauswahl =
    	CASE @Verwendung 
    	WHEN 'Toaster' THEN 'Spalte1'
    	WHEN 'Messer' THEN 'Spalte2'
    	ELSE ''	END;
    

    Am Rande: Einige Fälle kann man mit IIF oder CHOOSE ebenfalls lösen, CASE funktioniert in so ziemlich jedem Fall. Da IF ... ELSE eine Anweisung ist, kann man sie nur in einem Stapel oder einer Prozedur einsetzen, sie ist immer für sich abgeschlossen Funktionen wie CASE, IIF CHOOSE als Funktionen kann man direkt in eine Anweisung einbauen.

    Gruß Elmar

    P.S.: Wie sieht es bei Deinem anderen Optimierungsproblem aus?

    Montag, 15. Mai 2017 20:57
  • Hallo Toot,

    ich weiß ja nicht, was Du genau machen willst, aber wenn Du sicherstellt, dass das Ergebnis den gleichen Datentyp hat, kannst Du auch so etwas machen:

    -- Spalte1 und 2 sind z. B. varchar(100)
    Select
    	CASE @Verwendung 
    	WHEN 'Toaster' THEN Spalte1
    	WHEN 'Messer' THEN Spalte2
    	ELSE cast(NULL as varchar(100)
    	end as Daten
    from Tabelle;


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Dienstag, 16. Mai 2017 06:13
    Beantworter

Alle Antworten

  • Ah ich habe den Fehler gerade selber gefunden!!! Mir ist wieder eingefallen das man Variablen auch mit SELECT setzen kann und siehe da, dann funktioniert es auch.

    DECLARE @Timestamp varchar(30)
    --SET @Timestamp = CONVERT (datetime,'2017-04-23 00:00:00.000', 121);
    SET @Timestamp = '2017-04-23 00:00:00.000';
    
    DECLARE @Timestamp_END varchar(30)
    --SET @Timestamp_END = CONVERT (datetime,'2017-05-30 00:00:00.000', 121);
    SET @Timestamp_END ='2017-05-30 23:59:00.000';
    
    
    DECLARE @Verwendung varchar(30)
    SET @Verwendung = 'Toaster';
    DECLARE @Spaltenauswahl varchar(30);
    
    
    
    BEGIN
    if @Verwendung = 'Toaster' 
    			SELECT @Spaltenauswahl = 'Spalte1';
    				--print '1'
    		ELSE if @Verwendung = 'Messer'
    			SELECT @Spaltenauswahl = 'Spalte2'
    				--print '3'
    		
    		
    		
    		END
    			 
    print @Spaltenauswahl
    

    Montag, 15. Mai 2017 14:22
  • Dafür ist die IF Bedingung falsch ich erreiche nicht die anderen Bedingungen nach Toast
    Montag, 15. Mai 2017 14:47
  • Hallo Toot,

    dafür gibt es CASE, im Falle oben reicht dessen einfache Form:

    SET @Spaltenauswahl =
    	CASE @Verwendung 
    	WHEN 'Toaster' THEN 'Spalte1'
    	WHEN 'Messer' THEN 'Spalte2'
    	ELSE ''	END;
    

    Am Rande: Einige Fälle kann man mit IIF oder CHOOSE ebenfalls lösen, CASE funktioniert in so ziemlich jedem Fall. Da IF ... ELSE eine Anweisung ist, kann man sie nur in einem Stapel oder einer Prozedur einsetzen, sie ist immer für sich abgeschlossen Funktionen wie CASE, IIF CHOOSE als Funktionen kann man direkt in eine Anweisung einbauen.

    Gruß Elmar

    P.S.: Wie sieht es bei Deinem anderen Optimierungsproblem aus?

    Montag, 15. Mai 2017 20:57
  • Hallo Toot,

    ich weiß ja nicht, was Du genau machen willst, aber wenn Du sicherstellt, dass das Ergebnis den gleichen Datentyp hat, kannst Du auch so etwas machen:

    -- Spalte1 und 2 sind z. B. varchar(100)
    Select
    	CASE @Verwendung 
    	WHEN 'Toaster' THEN Spalte1
    	WHEN 'Messer' THEN Spalte2
    	ELSE cast(NULL as varchar(100)
    	end as Daten
    from Tabelle;


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Dienstag, 16. Mai 2017 06:13
    Beantworter
  • Danke an euch beide! mit Case ließ sich der Fall lösen. Vor allem ein dickes Dankeschön an Elmar der Licht ins dunkel gebracht hat mit CASE und IIF CHOOSE. Deswegen liebe ich es hier meine doofen Fragen zu stellen! Denn ich bekomme darauf ein schlaue Antwort!
    Mittwoch, 17. Mai 2017 06:27