我正在使用ColdFusion 9访问SQL Server 2008数据库。数据库设置为区分大小写。我想对此进行不区分大小写的搜索。就像是:
select field
from table
where field2 = 'test' COLLATE SQL_Latin1_General_CP1_CI_AS
复杂的是,我的where子句使用IN运算符来搜索以逗号分隔的字符串值列表。除非我在每个值之后设置排序规则,否则这似乎不起作用:
select field
from table
where field2 IN ('test' COLLATE SQL_Latin1_General_CP1_CI_AS, 'test2' COLLATE SQL_Latin1_General_CP1_CI_AS, ...)
我可以通过搜索和替换来做到这一点,但我也想将此列表包括在cfQueryParam中,该参数本身处理定界符。我不确定这是否可行,如果可以的话,它会变得非常混乱。因此,我想为整个查询设置排序规则。在Oracle中,这可以通过更改会话设置在查询之前完成。在SQL Server中是否可能发生这种情况,例如:
SET COLLATE SQL_Latin1_General_CP1_CI_AS
select field
from table
where field2 IN (<cfqueryparam cfsqltype="cf_sql_varchar" value="test1,test2,...">)
如果将collate语句放在IN子句之前,则此方法有效:
WHERE Column COLLATE SQL_Latin1_General_CP1_CI_AS IN
(
<cfqueryparam value="TEST1,TEST2,TEST3"
cfsqltype="cf_sql_varchar"
list="true">
)
但是,我认为绑定变量可能会导致意外的副作用。当我之后直接重新运行完全相同的查询时-只是没有进行COLLATE-它仍然执行不区分大小写的搜索。
WHERE Column IN
(
<cfqueryparam value="TEST1,TEST2,TEST3"
cfsqltype="cf_sql_varchar"
list="true">
)
但是以某种方式更改查询,因此不会缓存执行计划(例如,添加AND 1 = 1
到where子句),并且结果再次区分大小写。只是要记住一点。
更新:
为了避免缓存问题,一种可能性是使用派生表。然后将collate语句而不是IN子句应用于SELECT列表:
SELECT t.Column
FROM (
SELECT Column COLLATE SQL_Latin1_General_CP1_CI_AS AS Column
FROM YourTable
) t
WHERE t.Column IN
(
<cfqueryparam value="TEST1,TEST2,TEST3"
cfsqltype="cf_sql_varchar"
list="true">
)
就是说,如果您始终要对此列执行不区分大小写的搜索,则最好按照cfqueryparam的建议更改列的排序规则。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句