如何使用条件选择where子句

时间:2018-10-05 13:42:00

标签: mysql

我正在尝试为我的视图设置搜索过滤器。通常,视图返回完整的数据表。现在我有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 

0 个答案:

没有答案