表格中的列不能设为case insensitive,没有这样的选项。
一种选择是创建virtual column,如果您只想将字符串显示为不区分大小写,并搜索此类不区分大小写的字符串,但实际数据仍以区分大小写的方式存储在表中。
这是一个例子:
CREATE table TEST(
name VARCHAR2(100),
surname varchar2(100)
);
insert into test values('John', 'Toms' );
insert into test values('Tom', 'Johns' );
ALTER TABLE test add name_uppercase as (Upper( name ));
select * from test;
NAME SURNAME NAME_UPPERCASE
----------------------------------------
John Toms JOHN
Tom Johns TOM
CREATE INDEX Test_name_upper_ix on test( name_uppercase );
Select * FROM test WHERE name_uppercase = 'TOM';
NAME SURNAME NAME_UPPERCASE
----------------------------------------
Tom Johns TOM
请注意,在此示例中,为此类 virtual 列创建了一个索引。
此列可以像查询中的任何其他普通列一样使用,但不能更新。
但如果您想将数据不区分大小写直接存储在表中,您可以使用触发器在插入/更新期间转换数据,方式如下:
set define off
CREATE OR REPLACE TRIGGER surname_to_upper
BEFORE insert or update On test FOR EACH ROW
BEGIN
:new.surname := Upper( :new.surname );
END;
/
你也可以给表添加一个约束,只允许在某些列中插入大写数据,像这样:
alter table test
add constraint name_must_be_uppercase check( name = upper(name));
在这种情况下,当有人尝试插入包含小写字母的name 列时,她会收到错误:
insert into test values( 'Tom', 'Johns' );
SQL Error: ORA-02290: naruszono więzy CHECK (TEST.NAME_MUST_BE_UPPERCASE)
02290. 00000 - "check constraint (%s.%s) violated"
*Cause: The values being inserted do not satisfy the named check