我正在尝试建立一个免费的婚姻网站,其中主页包含一个带有一些文本框的简单形式。下拉菜单和搜索按钮。
点击后,它会将访问者带到另一个页面以及所有字段的查询字符串。
我使用以下存储过程来显示搜索结果。
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;安全的方式这样做?如果没有,那么我该如何改进呢。
答案 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注入攻击。