SQL中是否可以在LIKE语句中执行不区分大小写的搜索?

5

我正在使用 编写一个select查询语句,其中like语句的值是动态的。

  AND       e.rank_request_id = a.request_id
  AND       f.priority_request_id = a.request_id
  AND       b.status_type_id = c.status_id
  AND   b.status_request_id = a.request_id
  AND   a.request_id LIKE '%#form.searchbar#%'

但是这只返回与表单#form.searchbar#中每个字符的大小写匹配的结果。

请提供一个解决方案,使其不区分大小写。


1
哪个数据库管理系统?无论系统/语言如何,通常都会强制测试两侧的大小写。 - Tim Lehner
1
也要注意防止 SQL 注入。 - Tim Lehner
4个回答

18

我不知道你在使用什么数据库,但如果是Oracle的话,你可以强制两个东西的大小写。不过这样做会增加执行时间的成本, 因为它会对该列中的所有值执行此操作,但只有在有大量数据时才会看到成本,并且可以通过基于函数的索引解决这个问题。 所以,类似以下的语句,适用于Oracle:

AND UPPER(a.request_id) LIKE '%#UCase(Form.Searchbar)#%'

但我建议您使用queryparam,因为它似乎来自于用户输入的框,所以:

AND UPPER(a.request_id) LIKE <cfqueryparam value="%#UCase(Form.Searchbar)#%" cfsqltype="cf_sql_varchar" />

如果您在一个列中使用了upper函数,数据库将不会使用在该列中定义的索引,因此在大表中这将运行非常慢。您可以使用upper函数定义一个索引,然后像示例一样保留查询,那么数据库将使用索引。始终查看执行计划以决定数据库是否使用您的索引。 - Juan
如果是一个大表格,并且在列上运行任何函数(如我的示例),则会变得很慢,当然,表格大小和速度取决于资源/设置。我只是想补充一下建议,以防原帖发布者或其他人遇到此问题,请搜索“基于函数的索引”。 - Snipe656

3
你可以降低a.request_id和form.searchbar。
AND lower(a.request_id) LIKE '%#form.searchbar#%'

如果'%#form.searchbar#%'类似于Test或tEst,它将失败。 - aman.kejriwal
是的,刚刚想到了。忘记告诉你把form.searchbar也降低一点了 ;) - Soader03

2

已经有很多关于Oracle中不区分大小写的where子句的问题:

例如,这里

此外,这个查询看起来可能容易受到SQL注入攻击。更多信息在这里


这个问题有点不同,因为它涉及到ColdFusion。这是StackOverflow上的首例。 - aman.kejriwal

1

你可以像Snipe656建议的那样强制将所有内容转换为大写。你也可以使用regexp_instr函数进行不区分大小写的搜索。例如,要在EMP表中搜索每一行,其中ENAME包含字符串“in”,并且不区分大小写。

SQL> ed
Wrote file afiedt.buf

  1  select ename, empno
  2    from emp
  3*  where regexp_instr( ename, 'in', 1, 1, 1, 'i' ) > 0
SQL> /

ENAME           EMPNO
---------- ----------
MARTIN           7654
KING             7839

在您的情况下,可能是这样的:

AND   regexp_instr( a.request_id, '#form.searchbar#', 1, 1, 1, 'i' ) > 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接