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
我在 case
、then
和 @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()
将大大减少被搜索的行数。但是,它具有某些优点,例如可以在需要时轻松地在多列中进行搜索。
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
我在 case
、then
和 @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()
将大大减少被搜索的行数。但是,它具有某些优点,例如可以在需要时轻松地在多列中进行搜索。