2012-04-27 19 views
0

我正在构建一个系统,用户可以通过性别,年龄语言和用户兴趣搜索论坛中的用户。T-SQL搜索结果OR/AND条件

我有这个存储过程:

ALTER PROCEDURE dbo.FindFriends 
    (
    @language int, 
    @country nvarchar(50), 
    @sex int, 
    @ageFrom int, 
    @ageTo int, 
    @category nvarchar(50) 
    ) 
AS 
    SELECT u.*, cat.* 
    FROM [User] AS u 
    INNER JOIN categories AS cat ON u.user_id=cat.user_id 
    WHERE (age_presenentation BETWEEN @ageFrom AND @ageTo) AND [email protected] AND [email protected] AND [email protected] 

这种说法是我想要的。但有时,用户可能无法进入某些字段。例如,用户可能仅通过类别搜索用户。这将导致没有用户出现,因为我使用“And”运算符。有没有一种方法来结合逻辑,以便如果任何sql变量(例如@category,@angeTo)被赋予为空,那么语句将不包含它们?

回答

2

我已经跑了很多次了。

尝试:

WHERE (age_presenentation BETWEEN @ageFrom AND @ageTo) 
AND ((@language IS NULL) OR ([email protected])) 
AND ((@sex IS NULL) OR ([email protected])) 
AND ((@category IS NULL) OR ([email protected])) 

You can apply the same logic to the @ageFrom as well: 
((@ageFrom IS NULL) OR (age_presenentation BETWEEN @ageFrom AND @ageTo)) 

但是,这可能是太多记录。

+0

你有一个小错误..它是变量语言不行话..在第二行..非常的解决方案 – 2012-04-27 17:18:38

+0

你是对的,我的坏。我编辑过它。 – NickV 2012-04-27 17:27:09

2

这取决于你的意思是“空”。如果你的意思是NULL,那么试试这个:

WHERE age_presenentation BETWEEN @ageFrom AND @ageTo 
AND ([email protected] OR @language IS NULL) 
AND (sex[email protected] OR @sex IS NULL) 
AND ([email protected] OR @category IS NULL) 
+0

我认为你的解决方案将是satsifactory。我没有想过这个..我可以将变量设置为null无论如何..与asp.net编程...感谢 – 2012-04-27 17:16:50

+0

最好的做法是先检查IS NULL。 – NickV 2012-04-27 17:50:20