我正在使用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中,该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,...">)
答案 0 :(得分:1)
如果将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语句应用于SELECT列表而不是IN子句:
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建议的那样更改列的排序规则。
答案 1 :(得分:0)
SQL SERVER: 设置数据库的排序规则
ALTER DATABASE MyDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS ;
答案 2 :(得分:0)
如果您愿意,可以ALTER
列的区分大小写。
ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(20) -- don't forget to change the datatype to your column's datatype
COLLATE SQL_Latin1_General_CP1_CI_AS
来源: http://blog.sqlauthority.com/2007/04/30/case-sensitive-sql-query-search/
答案 3 :(得分:0)
另一种方法是根据varbinary结果进行搜索。例如,这会返回一条记录:
select record
from
(select 'Fred' record) temp
where record = 'fred'
但这不是:
select record
from
(select 'Fred' record) temp
where cast(record as varbinary) = cast('fred' as varbinary)
它简单有效但在where子句中使用函数会降低生产速度。为了解决这个问题,如果您认为值得,可以在表中创建一个持久计算列并将其编入索引。