CONTAINS 中的 case 语句出现语法错误

syntax error with case statement in CONTAINS

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 在这些词处显示红色 aqeakly

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

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)。您应该为此声明单独的变量。

你可以把它写成一个 where 和多个 contains:

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
      . . .

这不是完全匹配。它假定 contains() 将大大减少被搜索的行数。但是,它具有某些优点,例如可以在需要时轻松地在多列中进行搜索。