2015-04-22 64 views
0

我有没有工作的MySql如果在where子句中

SELECT DISTINCT CONCAT(u.firstname, ' ', u.lastname) AS fnameLname, s.student_number, u.user_id 
FROM user u 
LEFT OUTER JOIN student s ON u.user_id = s.user_id 
WHERE 
case when @filter != '' 
then ((u.firstname REGEXP CONCAT('^[', @filter, ']') OR u.lastname REGEXP CONCAT('^[', @filter, ']')) OR student_number REGEXP CONCAT('^[', @filter, ']')) 
else 1=1 
AND (u.user_type_id = 0) 
ORDER BY u.lastname, u.firstname 

我要选择从表用户,我已经实现搜索字段(在student_number或姓的开始搜索用户代码语句和姓氏(只是名字或姓氏的第一个字母))。

例如,如果我搜索“j s”,它将匹配例如John Smith,而不是John Moses。它也将匹配杰里米萨索。 @filter是asp.net中的控制参数。

任何人都可以帮助我吗?

+0

说明您搜索缩写或前缀 – Franky

+2

不确定为什么要尝试使用CASE语句。看起来你可能只是或几个WHERE子句在一起。 – Kickstart

回答

1

您可以使用andor。无需复杂的case when s和内case when S,等:

where ((@filter != '%' 
      and (u.firstname REGEXP CONCAT('^[', @filter, ']') 
       or u.lastname REGEXP CONCAT('^[', @filter, ']') 
       or student_number REGEXP CONCAT('^[', @filter, ']') 
      ) 
     ) 
     or @filter = '%' 
    ) 
and u.user_type_id = 0 

为@filter的默认值是“%” - 一个空字符串这是一个语法错误,因为空方括号。

+0

我不知道,但如果我用任何字符串(空或非空)替换@filter,它不起作用。它也不适用于asp.net。 – thecoparyew

+0

您是否使用如本例中的双等号或单个等号?当它不起作用时,它会发生错误还是不能带回任何东西? – Kickstart

+0

我复制了上面的代码。在HeidiSQL中,它给出了一个错误,在asp.net中,当我想填充gridview时,它不会带回任何东西。 – thecoparyew