2014-01-22 26 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 WHEN j1.Sub_Client IS NULL THEN '(BLANK)' 
    WHEN j1.Sub_Client = '' THEN '(BLANK)' 
    ELSE J1.Sub_Client 
END IN (@sub) 

你是不是詢問有關case,因此讓我們的例子中J1.Sub_Client IN (@sub)

它實際上意味着:

J1.Sub_Client = @sub 

誰寫它的人可能認爲他們可以在@sub中輸入逗號分隔列表。在這種情況下,人會誤以爲是相當於以下(假設@sub是「A,B,C」):

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' 

最後兩個是等價的。第一個測試J1.Sub_Client和字符串'a,b,c'之間的等同性 - 一個值,而不是三個。

+0

那末尾的'IN(@sub)'怎麼樣?我認爲這是OP所感興趣的部分。 – hatchet

+1

可能有2個表變量@ sub和@ supplier,因爲我們沒有來自OP的完整代碼。 –

+0

@DavidKhaykin。 。 。答案是固定的。 –

1

@sub聽起來像是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 

簡體,

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) 

在這種情況下 'SomeString' 由CASE語句它前面確定的,並使用任一J1.Sub_Client或值'(BLANK)'

更新

那麼IN(@sub)語法對於表變量是錯誤的,這要歸功於評論。這必須是一個標量變量。儘管如此,同樣的概念也適用,正如我上面所解釋的。這裏的差異實際上是指一個值,並不是很多可能的值。

的理由(@sub)的作品是因爲在工作與一個參數,如

IN('StackOverflow') 

當IN僅用於與一個值,它是相當於自寫

= 'StackOverflow' 

IN將=符號左側的完整值(而不是字符串包含操作類型)與右側的每個參數進行比較。

+0

如果'@ sub'是一個表變量,則語法將是'in(從@sub選擇子)'。 –

+0

好點。必須是一個標量變量。 –

相關問題