2014-02-20 34 views
0

我很難向同事解釋這個問題,所以請對我輕鬆一點。如果需要,我可以詳細說明。Case-When/HasNext變量輸入循環

因此,這裏是交易,我有一個關於SQL的Case When語句的理論問題。這不是我需要幫助的具體情況,這只是我需要回答的一個複雜問題,關於T-SQL語言的功能,我想知道這些功能是爲了我自己的未來目的。

我知道在Java中你可以創建循環並使用.hasNext()方法連續地從源(例如鍵盤)檢索輸入,通過這樣做你可以基本上創建一個循環,直到你輸入完了。

我想知道如果我可以使用類似的函數(糾正我,如果函數不是正確的術語),我可以使用T-SQL中的Case When語句。

下面是一些例子代碼僞:

case when [Column Y has next] then 'X' 

基本上我想知道如果我能告訴的案件時功能可按到時間可持續執行,直到用完值或遇到空值。

請讓我知道,如果我在這裏的正確軌道上,我的大腦有點卡在面向對象的Java世界和SQL的關係數據庫世界之間。所有的反饋意見。

+0

'case'操作的數據範圍由它屬於'select'語句的'where'和'join'(s)定義。 – dav1dsm1th

+0

你能否更具體地解釋一下你正試圖解決的實際問題?例如:「我試圖找到大於3的列中的第一個值」。這可能有一個簡單的SQL答案。但是你必須從思維的角度思考,而不是像Java這樣的命令式語言如何解決問題的低級機制。 – siride

+0

謝謝你的迴應,我不老實說有一個「特定」問題,如果SQL語言理解在數據集中具有另一個值的列的概念,我只是在懷疑。 – FluffyKittens

回答

1

案例 - 何時基本上是一個行操作。具體而言,您需要根據連接和where子句考慮您正在使用的數據集,然後考慮一下情況 - 運算符在結果集中的每一行上運行時的情況。因此,沒有前一行,下一行或「下一個」的概念。

這就是說,總有一種方法可以實現你想要的。一般來說,我通常會推薦一個「自我加入」。這實際上只是常規連接類型的一個特例(內部,左側,右側,完整和交叉)。這裏的不同之處在於,不是加入兩個不同的表格,而是將同一個表格加回自己。如果引入Row_Number函數並將其包含在where子句中,則可以將一行有效地連接到下一行,這將有效地爲您提供一種完成「具有下一個」功能的方法。

+0

因此,在使用時,Case-When一次對整個數據集(由join語句指定,以及我在查詢中選擇的內容)進行操作。它不會逐行執行,實質上是?如果這是真的,那麼我明白你在說什麼,但如果我錯了,請糾正我。 – FluffyKittens

+0

此外,我從來沒有想過自我加入的想法,感謝您的建議。我一定會在將來使用它。 – FluffyKittens

+1

可以這麼想......如果用「Select *」和所有連接以及where子句條件運行查詢,那麼Case-When只能訪問每行的數據。更具體地說,case-when語句不能訪問另一行的數據。通過執行自加入,可以通過讓查詢將其返回到同一行來有效地從另一行獲取數據。 –