繁体   English   中英

Oracle SQL区分大小写的索引

[英]Oracle sql case sensitive index

在我的项目数据库中,当前产品表中有一个名为“名称”的列,因此,该表可以包含“产品A”和“产品a”。应在简单的选择查询中选择这两个产品。

我已创建索引: CREATE INDEX IDX_PRODUCT_NAME ON PRODUCTS(NAME)

然后运行SQL查询: SELECT /*+ INDEX(PRODUCTS IDX_PRODUCT_NAME)*/ * FROM PRODUCTS WHERE NAME='Product_a'

我做错了什么?

PS我知道有关更改会话标志的变量: NLS_COMP=ANSI; NLS_SORT=BINARY_CI; NLS_COMP=ANSI; NLS_SORT=BINARY_CI; 但是对我来说,有趣的变体没有更改数据库设置,有可能吗? 例如,仅针对我的查询更改此标志。

请看看照片

更新: William Robertson在评论中帮助了我。 CREATE INDEX IDX_PRODUCT_NAME ON PRODUCTS(UPPER(NAME))

在运行查询之后: SELECT * FROM PRODUCTS WHERE **UPPER**(NAME)='PRODUCT_A' 并且此变体可以正常工作!

一种方法是添加虚拟列:

create table demo_products
( id          integer not null
, name        varchar2(20)
, name_upper  generated always as (upper(name)) );

create index demo_prod_upper_name_ix on demo_products(name_upper);

insert all
    into demo_products (id, name) values (1, 'Prod A')
    into demo_products (id, name) values (2, 'Prod a')
    into demo_products (id, name) values (3, 'Prod B')
    into demo_products (id, name) values (4, 'Prod b')
    into demo_products (id, name) values (5, 'prod A')
    into demo_products (id, name) values (6, 'Cheese')
    into demo_products (id, name) values (7, 'Bananas')
select * from dual;

commit;

select count(*) from demo_products where name_upper = 'PROD A';

  COUNT(*)
----------
         3

Plan hash value: 4158816492

---------------------------------------------------------------------------------------------
| Id  | Operation         | Name                    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                         |     1 |    12 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |                         |     1 |    12 |            |          |
|*  2 |   INDEX RANGE SCAN| DEMO_PROD_UPPER_NAME_IX |     1 |    12 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("NAME_UPPER"='PROD A')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM