我正在尝试为我的视图设置搜索过滤器。通常,视图返回完整的数据表。现在我有3个过滤器字段,用于此名字,姓氏和国家。我想如果用户在全部为空的情况下按下搜索,它将返回数据库中的所有数据。但是,即使在字段上具有字符串,它也会返回与该字段的字符串匹配的所有值。同样,如果其他字段也已满,则返回的数据将是与字段中相应字符串匹配的行。
由于我已使用存储过程进行分页,因此我也希望为此使用存储过程。但是我并不精通mysql,所以我真的不知道如何构造查询,以便我可以检查查询中的所有条件并从那里返回结果,而不是先获取数据然后过滤它。
即使一个输入不匹配其对应的值,我也需要数据库不返回任何内容。但是到目前为止,如果所有字段都有一个值,甚至是一个字段错误,我都会得到所有行,例如,即使它们与上一个字段不匹配,我也会得到行: 如果我搜索名字中的john并在最后一个Naem中输入kelly,则我将获得所有john和kelly的名字是否不匹配。
我的存储过程:
CREATE PROCEDURE [dbo].[GetFilterResult]
@PageIndex INT,
@pageSize INT,
@attr1 nvarchar(300),
@attr2 nvarchar(300),
@attr3 nvarchar(300)
AS
Begin
SELECT Accounts.firstName, Accounts.lastName, Accounts.Email,
Accounts.dateOfBirth, Accounts.phoneNo, Countries.CountryName
FROM Accounts INNER JOIN Countries On Accounts.CountryID =
Countries.CountryID
Where (Accounts.firstName LIKE CONCAT('%', @attr1, '%') and
Accounts.lastName LIKE CONCAT('%', @attr2, '%') and Accounts.CountryID
Like CONCAT('%', @attr3, '%'))
or (Accounts.firstName LIKE CONCAT('%', @attr1, '%') and
Accounts.lastName LIKE CONCAT('%', @attr2, '%') and @attr3 like CONCAT
('null'))
or (Accounts.firstName LIKE CONCAT('%', @attr1, '%') and
Accounts.CountryID LIKE CONCAT('%', @attr3, '%') and @attr2 like CONCAT
('null'))
or (Accounts.CountryID LIKE CONCAT('%', @attr3, '%') and
Accounts.lastName LIKE CONCAT('%', @attr2, '%')and @attr1 like CONCAT
('null'))
or (Accounts.firstName LIKE CONCAT('%', @attr1, '%')and @attr3 like
CONCAT ('null') and @attr2 like CONCAT ('null'))
or (Accounts.lastName LIKE CONCAT('%', @attr2, '%')and @attr3 like
CONCAT ('null') and @attr1 like CONCAT ('null'))
or (Accounts.CountryID LIKE CONCAT('%', @attr3, '%')and @attr1 like
CONCAT ('null') and @attr2 like CONCAT ('null'))
ORDER BY UserId OFFSET @PageSize*(@PageIndex-1) ROWS FETCH NEXT
@PageSize ROWS ONLY;
END