Oracle SQL регистр с учетом регистра
В моей базе данных проекта присутствует таблица "Продукты", один столбец называется "Имя". Таким образом, эта таблица может содержать "Продукт А" и "Продукт А". Оба продукта должны быть выбраны в запросе простого выбора.
Я создал индекс: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;
Но для меня интересный вариант без изменений в настройках БД, возможно ли? Или, например, изменить этот флаг только для моего запроса.
Пожалуйста, посмотрите картинку
ОБНОВЛЕНИЕ:Уильям Робертсон помог мне в комментариях.
CREATE INDEX IDX_PRODUCT_NAME ON PRODUCTS(UPPER(NAME))
После этого запустите запрос:
SELECT *
FROM PRODUCTS
WHERE **UPPER**(NAME)='PRODUCT_A'
И этот вариант отлично работает!
1 ответ
Один из подходов - добавить виртуальный столбец:
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')