2016-11-17 71 views
-1

我有一個關於sql語句的問題。是否有可能通過這種方式進行查詢?我需要過濾一個where子句,它取決於@user_id的值。存儲過程更改where子句語句

ALTER PROCEDURE [dbo].[getUserAddress] 
    @user_id int = null 
AS 

SELECT user_id, state_code, address from UserAddress 

IF(@user_id > 10) 
BEGIN 
WHERE state_code = 'CA' 
END 
ELSE 
    WHERE address = 'HILLS' 
END 

我試圖這樣做,但它似乎不是一個標準的方式。

IF(@user_id > 10) 
BEGIN 
SELECT user_id, state_code, address from UserAddress WHERE state_code = 'CA' 
END 
ELSE 
    SELECT user_id, state_code, address from UserAddress WHERE address = 'HILLS' 
END 

請指教一下是這個概念的最佳方法。請幫忙。 謝謝

+2

您使用的是MySQL還是MS SQL Server? (不要標記不涉及的產品。) – jarlh

+0

SELECT IF如果WHERE是您應該遵循的順序,並且如果您使用的是MySQL,那麼@jarlh表示您需要指定! –

+0

只有兩個條件?你認爲你需要在未來增加更多條件嗎? – Steve

回答

2

您在else後缺少begin。試試這個:

IF(@user_id > 10) 
BEGIN 
SELECT user_id, state_code, address from UserAddress WHERE state_code = 'CA' 
END 
ELSE 
BEGIN 
    SELECT user_id, state_code, address from UserAddress WHERE address = 'HILLS' 
END 
2

您可以簡化:

select 
    user_id, 
    state_code, 
    address 
from 
    UserAddress 
where 
    (@user_id > 10 and state_code = 'CA') or 
    (@user_id IS NULL OR (@user_id <= 10 and address = 'HILLS')) 

如果您將在未來增加更多的過濾條件,你應該知道的參數嗅探。

另外,在(user_id, state_code, address)上創建索引將成爲此查詢的覆蓋索引。

+1

這是錯誤的!如果'(address ='HILLS')'是真的,那麼'@ user_id'上的檢查將被忽略。 – MtwStark

+0

你是對的 –

+0

這仍然不等同於OP詢問的內容(因爲NULL),但足夠接近。扭轉我的downvote。 –

0

而不是這個用途可以在WHERE語句使用情況:

SELECT user_id, state_code, address from UserAddress WHERE 
    (case when @user_id > 10 then state_code else address end) 
    = (case when @user_id > 10 then 'CA' else 'HILLS' end) 
+0

我喜歡這種方式,非常聰明 – MtwStark

+0

恭維。 –

1

您也可以在存儲過程中使用動態SQL查詢。

查詢

declare @sql as varchar(max); 
select @sql = 'select * from [UserAddress] ' 
    + stuff((select case when @user_d > 10 
     then 'where state_code= ''CA''' 
     else 'where address = ''Hills''' end 
    for xml path('')), 1,0,'') 

exec(@sql); 
0

試試這個

SELECT user_id, state_code, address from UserAddress 
WHERE 
((WHERE state_code = 'CA') AND (@user_id > 10)) 
OR 
((WHERE address = 'HILLS') AND (@user_id <= 10)) 
0

你可以簡單地...

WHERE 
    (@user_id > 10 AND state_code = 'CA') 
    OR ((@user_id <= 10 OR @user_id IS NULL) AND address = 'HILLS') 

然而,這種方法可能不會產生最佳的查詢計劃。如果事實證明這是一個問題,請使用單獨的查詢(如您已經嘗試的那樣,但修復AsheraH建議的語法錯誤)或動態SQL。

順便說一句,你可以更簡潔這樣寫單獨的查詢:

IF @user_id > 10 
    SELECT user_id, state_code, address from UserAddress WHERE state_code = 'CA' 
ELSE 
    SELECT user_id, state_code, address from UserAddress WHERE address = 'HILLS' 
-2

你可以試試這個:

ALTER PROCEDURE [DBO]。[getUserAddress]
@user_id INT =空
AS
BEGIN

'從UserAddress SELECT USER_ID,STATE_CODE,地址'
IF(@user_id> 10聲明@sql爲nvarchar(5000)
組@ SQL = )
BEGIN
組@ SQL = @ SQL + 'WHERE STATE_CODE = '' CA '''
END
ELSE
組@ SQL = @ SQL + 'WHERE地址= '' HILLS '''
END

Exec(@sql)
END

相關問題