2015-02-05 148 views
0
select Rowid, @counter 
from Patients where 
Contains 
((case when @ColumnnName = 'firstname' then firstname --here 
      when @ColumnnName = 'middlename' then middlename 
      when @ColumnnName = 'lastname' then lastname 
      end), SUBSTRING(@parameterFromUser, 1, @counter)); --here 

我得到语法错误在casethen@parameterFromUser。语法似乎有什么问题? SSMS在这些词上显示红色与case语句的语法错误CONTAINS

回答

2

您可以与多个contains写为一个单一的where

select Rowid, @counter 
from Patients 
where (@ColumnnName = 'firstname' and Contains(firstname, SUBSTRING(@parameterFromUser, 1, @counter))) or 
     (@ColumnnName = 'middlename' and Contains(middlename, SUBSTRING(@parameterFromUser, 1, @counter))) or 
     (@ColumnnName = 'lastname' and Contains(lastname, SUBSTRING(@parameterFromUser, 1, @counter))); 

作为一个说明:我不知道这将如何优化。

我可能会建议一个子查询方法:

select * 
from (select Rowid, @counter 
     from Patients 
     where Contains((firstname, middlename, lastname), SUBSTRING(@parameterFromUser, 1, @counter)) 
    ) 
where @ColumnName = 'firstname' and firstname like '%' + @parameterFromUser + '%' or 
     @ColumnName = 'middlename' and middlename like '%' + @parameterFromUser + '%' or 
     . . . 

这是不完全匹配。它假定将大大减少正在搜索的行数。但是,它具有一定的优势,例如,如果需要,可以轻松地在多列中进行搜索。

1

这只是错误的语法。你不能像你这样做。

CONTAINS ( 
    { 
     column_name | (column_list) 
     | * 
     | PROPERTY ({ column_name }, 'property_name') 
    } 
    , '<contains_search_condition>' 
    [ , LANGUAGE language_term ] 
    ) 

您被允许使用一列或(列列表)。

可以为改写:

If @ColumnnName = 'firstname' 
    Insert into @ResultTable(...Columns...) 
    select Rowid, @counter 
    from Patients where 
    Contains(firstname, SUBSTRING(@parameterFromUser, 1, @counter)); 
Else IF If @ColumnnName = 'middlename' 
    Insert into @ResultTable(...Columns...) 
    select Rowid, @counter 
    from Patients where 
    Contains(middlename, SUBSTRING(@parameterFromUser, 1, @counter)); 

其实你也不能使用SUBSTRING(@parameterFromUser, 1, @counter)。你应该为此声明单独的变量。

+0

好的,但case语句只给出一个列名。这个语句在用户定义的函数中,我的列名在一个变量中,我不能直接在where子句中使用变量。那么,我可以在CONTAINS里面的column_name中使用这个变量吗? – Simran 2015-02-05 15:05:26

+0

不,你不能 – 2015-02-05 15:07:14

+0

这里有大约10-15列,我直接插入到表中。插入到table_name中选择x,y,z/*查询的其余部分*/ – Simran 2015-02-05 15:08:09