2017-11-30 2 views
0

Ich versuche tatsächlich, die Daten aus einer Tabelle zu bekommen, aber ich wollte, dass "Und/Oder" ändert sich basierend auf der Tabelle. Ich benutze SQL Server.Wie man ein Und-Oder als Variable verwendet

Ich bin in etwa so:

DECLARE @TURNOS TABLE (ID INT IDENTITY(1, 1), 
         INITURNO INT, 
         ENDTURNO INT, 
         ANDOR VARCHAR(3) 
        ); 

INSERT INTO @TURNOS 
VALUES (23, 7, 'OR'), (7, 15, 'AND'), (15, 23, 'AND') 

Und ich versuche, so etwas zu tun:

WHILE (@count <= (SELECT COUNT(ID) FROM @TURNOS)) 
BEGIN 
    SET @initurno = SELECT INITURNO FROM @TURNOS WHERE ID = @count 
    SET @endturno = SELECT ENDTURNO FROM @TURNOS WHERE ID = @count 
    SET @andor = SELECT ANDOR FROM @TURNOS WHERE ID = @count 

    INSERT INTO @AnotherTable 
     SELECT * 
     FROM dbo.TableA 
     WHERE DATES BETWEEN DATEPART(hh, DATES) >= @initurno @andor DATEPART(hh, DATES) < @enturno 
END 

Gibt es eine Möglichkeit, dass ich eine Variable verwenden kann und/oder wie ich es mit @andor probiert habe?

Vielen Dank im Voraus :)

Antwort

1

Sie könnten dynamisches SQL verwenden, wenn Sie den Operator wirklich als Variable benötigen. Wenn die Abfrage jedoch nur bedingt sein soll, fügen Sie einfach beide Bedingungen ein und schalten sie basierend auf der Variablen um.

insert into @AnotherTable 
select * from dbo.TableA 
where 
/*First condition */ 
(
@andor = 'AND' 
AND DATES between Datepart(hh,DATES)>= @INITURNO 
AND Datepart(hh,DATES)< @ENDTURNO 
) 

OR 
/* Second condition */ 
(
@andor = 'OR' 
AND (
    DATES between Datepart(hh,DATES)>= @INITURNO 
    OR Datepart(hh,DATES)< @ENDTURNO 
    ) 
) 
+0

Oh, und ich habe nicht einmal die Verwendung der BETWEEN Operator Bekanntmachung, die GSazheniuk bemerkt (und korrigiert). –

1

Sie suchen nach Dynamic SQL. Du kannst es so versuchen;

declare @query nvarchar(max) 
while(@count <= (select count(ID) from @TURNOS)) 
begin 
    SET @num1 = select INITURNO from @TURNOS where ID = @count 
    SET @num2 = select ENDTURNO from @TURNOS where ID = @count 
    SET @andor = select ANDOR from @TURNOS where ID = @count 

    set @query = 'insert into @AnotherTable 
    select * from dbo.TableA where DATES between Datepart(hh,DATES)>= '+cast(@INITURNO as nvarchar(5))+' '[email protected]+' Datepart(hh,DATES)< '+cast(@ENDTURNO as nvarchar(5))+'' 
    EXECUTE sp_executesql @query 
end 
0

Ich bin kein großer Fan von dynamischem SQL, aber selbst wenn ich war, ich glaube, das für Schlüsselwort BETWEEN nicht richtig Syntax ist?

So, hier ist das, was meine Lösung aussehen würde, und ich werde die ganze Abfrage nicht kopieren, sondern nur select Teil davon:

select * from dbo.TableA 
    where (@andor = 'AND' AND Datepart(hh,DATES) BETWEEN @initurno AND @enturno) 
    OR (@andor = 'OR' AND (Datepart(hh,DATES) >= @initurno OR Datepart(hh,DATES) <= @enturno)) 

Bitte beachten Sie, dass ich <= mit @enturno verwendet, weil das ist, wie BETWEEN funktioniert, es ist rechte Grenze inklusive. Wenn Sie wollen @enturno nicht enthalten, als Sie müßten obere Abfrage neu zu schreiben >= und < für beiden Fälle zu verwenden:

select * from dbo.TableA 
    where (@andor = 'AND' AND Datepart(hh,DATES) >= @initurno AND Datepart(hh,DATES) < @enturno) 
    OR (@andor = 'OR' AND (Datepart(hh,DATES) >= @initurno OR Datepart(hh,DATES) < @enturno)) 
+0

Ja, du hast Recht. Ich werde den Beitrag bearbeiten. Ty – Falakienos

Verwandte Themen