2017-11-30 6 views
0

私は実際にテーブルからデータを取得しようとしていますが、テーブルに基づいて "And/Or"の変更が必要でした。私はSQL Serverを使用しています。変数としてAnd-Orを使用する方法

は、私はこのような何かによ:

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') 

そして、私はこのような何かをやろうとしている:

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 

は、Iおよび/または変数を使用することができますどのような方法があります私は @andorで試したようですか?

ありがとうございます。

答えて

1

実際に演算子を変数にする必要がある場合は、動的SQLを使用できます。しかし、クエリを条件付きにする必要がある場合は、両方の条件を含めるだけで、変数に基づいて条件を切り替えることができます。

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

ああ、そして私もBETWEEN演算子の使用、GSazheniukに気付かなかった:あなたは@enturnoを含めたくない場合は、両方のケースのために>=<を使用するために、上のクエリを書き直す必要がありますよりも、 (修正された)。 –

1

動的SQLを探しています。あなたはこのようにしてみることができます。

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

私は動的SQLの大きなファンではありませんが、私がいたとしても、これはBETWEENキーワードの正しい構文ではないと思いますか?だからここ

は、私の解決策はどのようになるかで、私は、全体のクエリをコピーしないだろうが、それだけselect一部:

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)) 

それはどのようなので、私は@enturno<=を使用したことを、注意してくださいBETWEENが動作しますが、これは正しい制限です。

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

ええ、そうです。私はその投稿を編集します。タイ – Falakienos

関連する問題