2017-11-30 7 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 

내가 및/또는 변수를 사용할 수있는 방법이 있나요 @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

아, 그리고 난 운영자 사이의 사용, 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 * 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<=를 사용,주의하시기 바랍니다 : 그래서 여기

내 솔루션의 모습, 그리고 전체 쿼리를 복사하지 않습니다 만의 select 부분은 무엇인가 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