【问题标题】:Is it possible to perform a case insensitive search in LIKE statement in SQL? [duplicate]是否可以在 SQL 的 LIKE 语句中执行不区分大小写的搜索? [复制]
【发布时间】:2012-04-13 11:15:00
【问题描述】:

我用来写一个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#中每个字符的大小写的结果。

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

【问题讨论】:

  • 哪个 DBMS?无论系统/语言如何,通常都会强制测试双方的大小写。
  • 也要注意 SQL 注入。

标签: sql oracle coldfusion case-insensitive


【解决方案1】:

我不知道您使用的是什么数据库,但如果这是针对 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" />

【讨论】:

  • 如果在列中使用upper,如果在该列中定义,数据库将不会使用索引,儿子在大表中运行会很慢。您可以使用 upper 函数定义索引并像示例一样保留查询,然后数据库将使用该索引。始终查看数据库决定使用或不使用您的索引的执行计划。
  • 是的,如果它是一个大表,像我的示例那样在列上运行任何函数都会很慢。表大小和速度当然取决于资源/设置。我只是想补充一下建议,以防原始海报遇到这个或其他人,请搜索基于函数的索引。
【解决方案2】:

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

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

【讨论】:

  • 如果 '%#form.searchbar#%' 类似于 Test 或 tEst 则失败
  • 是的,刚刚想通了。忘了告诉让 form.searchbar 也降低;)
【解决方案3】:

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

例如,here

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

【讨论】:

  • 这个问题有点不同,因为它也与 ColdFusion 有关。首先是 StackOverflow 上的一种
【解决方案4】:

您可以按照 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2016-01-17
    • 1970-01-01
    • 2013-04-17
    • 2023-03-17
    相关资源
    最近更新 更多