【问题标题】:How to get case insensitive records from oracle?如何从 oracle 获取不区分大小写的记录?
【发布时间】:2016-02-02 12:01:51
【问题描述】:

我将如何从customer 表中获取从'a' 开始的所有customer_names

为此,我想获取所有包含字母 a 的名称,无论大小写如何。我不想使用to_upper(),因为它会对查询性能产生负面影响。

【问题讨论】:

  • 您只搜索“A”?或任何信?或任何字符串?
  • 搜索字母“A”将返回许多行,并且任何索引对性能都没有用处。您确定要访问索引吗?
  • 我认为与%a% 搜索相比,您的to_upper 性能影响很小。

标签: sql database oracle oracle11g


【解决方案1】:

如果只关心性能,可以创建基于函数的索引

create index idx_fbi_upname
on
table( upper(name) );

select *
  from table t
 where upper(t.name) like 'A%'

此查询可以使用upper(name) 上的索引。当然,如果您想同时进行区分大小写和不区分大小写的查询,您最终可能会得到两倍的索引,这将涉及更多的存储空间和更多的维护工作。

【讨论】:

    【解决方案2】:

    获取包含字母“a”的名称可能需要进行全表扫描。你可以这样做:

    where name like '%a%' or name like '%A%'
    

    where lower(name) like '%a%'
    

    在大多数情况下,这些都需要全表扫描。

    如果您只是在寻找以“a”开始的行,那么您可以这样做:

    select t.*
    from table t
    where t.name like 'a%'
    union all
    select t.*
    from table t
    where t.name like 'A%';
    

    这可以利用t(name) 上的索引。但是,这仍然可能不使用索引,因为这样的字符串操作可能没有足够的选择性。

    【讨论】:

    • 第一种方法对于多个字母不正确。 (例如:ABC)。第二种方法需要时间。还有什么?
    • @krishnapriya 第一种方法有什么问题?条件 获取该字符串。此外,它们的速度相同。将进行全表扫描。
    • @krishnapriya,Justin Cave 的回答适用于任何子字符串,并且将使用基于函数的索引,所以我会选择这个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2011-10-23
    • 2014-08-13
    相关资源
    最近更新 更多