2013-12-11 113 views
0

所以我的查詢是下面的,它可以返回很多結果:存儲過程執行查詢,如果查詢僅返回1個結果返回選擇的值

SELECT P_CODE, NAME FROM TEST.dbo.PEOPLE 
WHERE NAME LIKE '%JA%' 
AND P_CODE LIKE '%003%' 
AND DOB LIKE '%1958%' 
AND HKID = '' 
AND (MOBILE LIKE '%28%' OR TEL LIKE '%28%') 

我想這個整合到一個存儲過程(或View?),只有查詢結果爲1行時纔會返回結果。如果有0或> 1,那麼它不應該返回結果。

+1

你想讓它返回一個空結果集,或者根本不運行select? –

+0

它將返回到一個Django模型,所以我認爲一個空的結果集將是最簡化的。 – DanH

回答

2

如果你只是想回到在其他情況下大於1的空結果:

;WITH x AS 
(
    SELECT P_CODE, NAME, c = COUNT(*) OVER() 
    FROM TEST.dbo.PEOPLE 
    WHERE NAME LIKE '%JA%' 
    AND P_CODE LIKE '%003%' 
    AND DOB LIKE '%1958%' 
    AND HKID = '' 
    AND (MOBILE LIKE '%28%' OR TEL LIKE '%28%') 
) 
SELECT P_CODE, NAME FROM x WHERE c = 1; 

否則,您必須運行兩次查詢(或轉儲的結果,中間存儲,如#臨時表) - 一次獲得計數,一次根據計數決定是否運行SELECT或不。

+0

完美,謝謝! – DanH

1

有效要從LINQ到SQL實施FirstOrDefault(一個類似於),但在服務器端,這意味着你將需要在存儲過程執行查詢做了,結果傾倒入temp table variable然後之後訪問@@ROWCOUNT以獲取返回的行數,然後決定是否將結果轉發給調用者。 如果這樣做,請確保在臨時表的查詢中使用TOP 1,以便只根據需要獲得單個結果。

UPDATE:

  • 我描述從什麼亞倫介紹了他的答案的替代解決方案(我更喜歡)。
  • 刪除解決方案規範中不必要的TOP說明符。
+1

如果您根據臨時表中的行數決定是否運行查詢,則不需要使用「TOP 1」。 (如果計數爲1,則運行查詢;不需要TOP,如果計數小於1,則不要運行查詢;仍然不需要TOP) –

+0

感謝指針,我只是不太瞭解速度今天早上。 ;-) –

+1

另外,你不需要告訴我們你在編輯中刪除了什麼(或者用刪除線保留它)。你可以刪除它。如果有人好奇,他們可以從[點擊編輯的鏈接](http://stackoverflow.com/posts/20521066/revisions)獲取該信息。當人們在存儲在源代碼控制中的代碼中執行此操作時,它令我發狂。您無需評論不再屬於的代碼,只需將其刪除即可。我們總是可以從版本控制中恢復。 –