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

时间:2012-03-29 18:53:43

标签: sql oracle coldfusion case-insensitive

我用来编写一个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#中的每个字符的Case匹配时才返回结果。

请为此建议一种解决方法,以使其不区分大小写。

4 个答案:

答案 0 :(得分:17)

我不知道您使用的数据库,但如果这是针对Oracle的,那么您可以强制执行这两种情况。这虽然是执行时间的代价,因为它为该列中的所有值执行此操作,但是如果您拥有大量数据并且可以使用基于函数的索引解决该问题,则只会看到成本。对于Oracle来说,这样的事情就是这样:

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

但我建议您使用查询参数,因为它似乎来自用户输入的框,所以:

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

答案 1 :(得分:2)

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

例如,here

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

答案 2 :(得分:1)

您可以降低a.request_id和form.searchbar

AND lower(a.request_id) LIKE '%#form.searchbar#%'

答案 3 :(得分: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