高级搜索查询

时间:2014-01-14 01:13:09

标签: c# asp.net sql sql-server

我正在尝试建立一个免费的婚姻网站,其中主页包含一个带有一些文本框的简单形式。下拉菜单和搜索按钮。

点击后,它会将访问者带到另一个页面以及所有字段的查询字符串。

我使用以下存储过程来显示搜索结果。

ALTER PROCEDURE dbo.homesearch
@gender varchar(6),
@age int,
@age2 int,
@religion varchar(50),
@status varchar(11),
@resCountry varchar(50),
@resCity varchar(50)
AS
SELECT * 
    FROM [users] 
    WHERE 
       ( ([age] > @age) OR ([age] < @age2) OR 
         ([gender] = @gender) OR ([religion] = @religion) OR 
         ([status] = @status) OR ([resCountry] = @resCountry) OR 
         ([resCity] = @resCity))

RETURN

问题是我坚持使用 OR&amp; AND

如果我使用OR,则会显示许多不相关的结果。

如果我使用AND,那么如果任何搜索查询为空,该怎么办。

对不起,我是新手,对我的朋友来说,我的问题可能太幼稚了。

另一个问题,如果它是最好的&amp;安全的方式这样做?如果没有,那么我该如何改进呢。

4 个答案:

答案 0 :(得分:1)

如果您使用isNull ...

,请对您的参数使用and
SELECT * FROM [users] 
WHERE (([age] > isNull(@age, [age]) 
AND    ([age] < isNull(@age2, [age])
AND ([gender] = isNull(@gender, [gender]) 
AND ([religion] = isNull(@religion, [relegion]) 
AND ([status] = isNull(@status,[status])
AND ([resCountry] = isNull(@resCountry, [resCountry]) 
AND ([resCity] = isNull(@resCity, [resCity]))

以下是对isNull的一些解读,它是有用的兄弟Coalesce。如果数据中的空值为null = null计算结果为false,则Coalesce可以派上用场。见:Why does NULL = NULL evaluate to false in SQL server。作为一个例子,我们假设religion在数据库中的值可以为null。

SELECT * FROM [users] 
WHERE (isNull([religion],'N/A') = Coalesce(@religion, [relegion], 'N/A') 
... etc

我可能不会在现实世界中使用N/A,你可以使用空字符串,整数,任何你喜欢的东西,只要它对于相等测试的两边都是一样的。

在旁注中,我会使用<=>=进行年龄测试。

答案 1 :(得分:0)

这取决于你想要什么。

AND&amp;和或者像TSQL这样的编程语言是这样的:

在条件之间使用OR时 (如:([age] > @age) OR ([age] < @age2) OR ([gender] = @gender) OR ([religion] = @religion) ) 这意味着如果有一个条件是真的,请执行此(SELECT * FROM users)

但是当你在条件之间使用AND时 (如:([age] > @age) AND ([age] < @age2) AND ([gender] = @gender) AND ([religion] = @religion)) 意味着如果我的所有条件都成立,请执行此操作(SELECT * FROM users)

因此,如果您希望结果包含具有所有条件的用户,请使用AND。 但是,如果您希望结果包含甚至具有其中一个条件(或更多)的用户,请使用OR。

答案 2 :(得分:0)

所以基本的想法是参数可能是null或者可能不是,所以像这样进行查询

ALTER PROCEDURE dbo.homesearch
@gender varchar(6),
@age int,
@age2 int,
@religion varchar(50),
@status varchar(11),
@resCountry varchar(50),
@resCity varchar(50)

AS
SELECT * FROM [users] 
WHERE (@gender is null or gender = @gender)
AND ((@age is null or age > @age)
AND (@age2 is null or age <@age2))
AND (@religion is null or religion=@religon)
AND (@status is null or status =@status )
AND (@resCountry is null or resCountry =@resCountry )
AND (@resCity is null or resCity =@resCity )
RETURN

答案 3 :(得分:0)

使用存储过程是查询数据的最佳实践和安全方法之一。您也可以使用“动态SQL”来添加更多高级搜索功能,但这样做并不是最佳做法,而且很容易受到Sql注入攻击。