2014-01-22 1 views
0

누군가가 나를 도울 수 있기를 바랬습니다. 나는 TSQL에 새로 온 다음 코드를 가로 질러 온 :이 문장에서 IN (@sub)이 무엇을 의미하는지 알아야합니다.

FROM 
    Job_List j1 
INNER JOIN 
    Item_List i1 ON j1.Control_No = i1.Control_No 
WHERE 
    CONVERT(DATE,j1.Settlement_Date_Actual) >= CONVERT(DATE,@sday) 
    AND CONVERT(DATE,j1.Settlement_Date_Actual) <= CONVERT(DATE,@eday) 
    AND j1.Supplier_No IN(@supplier) 
    AND CASE 
      WHEN j1.Sub_Client IS NULL THEN '(BLANK)' 
      WHEN j1.Sub_Client = '' THEN '(BLANK)' 
      ELSE J1.Sub_Client 
    END IN(@sub) 

***는 사람이 IN (@sub)가 무엇을하고 있는지 나에게 설명 할 수 있습니까?

+0

어떤 부분에 문제가 있습니까? 'IN' 또는'@ something'? – vbo

답변

1

표현은 : 당신은 case에 대해 물어, 그래서 예를 보자되지 않습니다

CASE WHEN j1.Sub_Client IS NULL THEN '(BLANK)' 
    WHEN j1.Sub_Client = '' THEN '(BLANK)' 
    ELSE J1.Sub_Client 
END IN (@sub) 

J1.Sub_Client IN (@sub)

실제로 의미

J1.Sub_Client = @sub 

을 쓴 사람이 수도 @sub에 쉼표로 구분 된 목록을 넣을 수 있다고 생각했습니다.

J1.Sub_Client in (@sub) 
J1.Sub_Client in ('a', 'b', 'c') 
J1.Sub_Client = 'a' or J1.Sub_Client = 'b' or J1.Sub_Client = 'c' 

마지막 두 동등 :이 경우, 사람이 실수로 상응 다음 (@sub 가정하는 "A, B, C '이다)라고 생각했을 것이다. 첫 번째 테스트에서는 J1.Sub_Client과 문자열 'a,b,c' 사이의 동등성을 테스트합니다. 하나가 아닌 3을 테스트합니다.

+0

끝에있는'IN (@sub) '은 어떨까요? 나는 이것이 OP가 관심있는 부분이라고 생각한다. – hatchet

+1

우리는 OP의 전체 코드를 가지고 있지 않기 때문에 2 개의 테이블 변수, @ sub와 @ supplier가있을 수있다. –

+0

@DavidKhaykin. . . 대답은 고정되어 있습니다. –

1

@sub sounds는 table variable이고 IN (@sub)은 바로 앞에 case 문을 검사하고 있습니다.

정교하게하려면,

마지막 행은 case 문의 일부입니다. 단순화

WHERE 
    CONVERT(DATE,j1.Settlement_Date_Actual) >= CONVERT(DATE,@sday) 
    AND CONVERT(DATE,j1.Settlement_Date_Actual) <= CONVERT(DATE,@eday) 
    AND j1.Supplier_No IN(@supplier) 
    AND CASE -- Begin case statement 
      WHEN j1.Sub_Client IS NULL THEN '(BLANK)' 
      WHEN j1.Sub_Client = '' THEN '(BLANK)' 
      ELSE J1.Sub_Client 
    END IN(@sub) -- Case statement ends, and the result is the value checked against the @sub table variable 

,이 경우 'SomeString'에서

WHERE 
    CONVERT(DATE,j1.Settlement_Date_Actual) >= CONVERT(DATE,@sday) 
    AND CONVERT(DATE,j1.Settlement_Date_Actual) <= CONVERT(DATE,@eday) 
    AND j1.Supplier_No IN(@supplier) 
    AND 'SomeString' IN(@sub) 

가 선행 CASE 문에 의해 결정되고 사용되어 어느 J1.Sub_Client 또는 값 '(BLANK)'

업데이트

IN (@sub) 구문은 주석으로 인해 테이블 ​​변수에 잘못되었습니다. 이것은 스칼라 변수 여야합니다. 하지만 위에서 설명한 것처럼 동일한 개념이 적용됩니다. 여기서 IN이되는 차이점은 실제로 하나의 값을 가리키며 가능한 많은 값을 의미하지 않습니다. IN은

IN 단 하나 개의 값으로 사용된다
IN('StackOverflow') 

같이, 하나 개의 파라미터로 작동하기 때문에

(@sub)에 따라서 작동

이고, 그 이후

= 'StackOverflow' 

를 작성하는 것과의 IN은 = 부호의 왼쪽에있는 전체 값 (및 조작 유형을 포함하는 문자열이 아님)을 오른쪽의 각 매개 변수와 비교합니다.

+0

'@ sub'가 테이블 변수 인 경우, 구문은'in (@sub로부터 select sub)'일 것입니다. –

+0

좋은 지적. 스칼라 변수 여야합니다. –

관련 문제