【问题标题】:Set column table case insensitive oracle 11g设置列表不区分大小写 oracle 11g
【发布时间】:2015-11-29 03:43:09
【问题描述】:

我想让USERS 表中的NAME 列中的数据不区分大小写,我该怎么做?我想像这样使用alter table:

ALTER TABLE table_name ALTER COLUMN column_name (something to make it case insensitive);

【问题讨论】:

  • names 在 SQL 中始终不区分大小写。 select column_name from some_tableselect COLUMN_NAME from some_table 相同
  • 不清楚你的意思是列名本身不区分大小写还是列中的数据? 1. 对于先验,它已经不区分大小写。 2. 如果您指的是字典视图中的元数据,则默认情况下区分大小写,即 UPPER。 3. 但是,如果您在创建时使用双引号,则需要始终将其用于任何引用。 4.如果你的意思是对列进行不区分大小写的操作,那么看Oracle – Case Insensitive Sorts & Compares
  • 不,我的意思是 'USERS' 表的 'NAME' 列中的数据,我想要将这一列设置为所有数据不区分大小写

标签: oracle oracle11g


【解决方案1】:

表格中的列不能设为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

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2011-04-26
    相关资源
    最近更新 更多