Oracle中是否有办法使列不区分大小写?

Mik*_*sen 6 sql oracle entity-framework case-insensitive oracle11g

我想从UsersLogon中等于的表中选择行"foo"- 但是,我还想返回"Foo""FOO".

我可以这样做:

SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO';
Run Code Online (Sandbox Code Playgroud)

然后将我的参数转换为大写.但是,在我们的代码中,我们有数百个点,我们必须更新它.

有没有办法使表模式本身不区分大小写,所以这些查询只能在不修改的情况下工作?谢谢!

UPDATE

我宁愿不在整个数据库或会话级别更改区分大小写.更改SQL查询很难,因为我们使用.NET实体框架并且在整个地方都对这个表进行LINQ查询.除非您想要更改每个LINQ查询,否则EF似乎不支持自动转换大小写.

Luk*_*zda 5

我宁愿不更改整个数据库或会话级别的区分大小写。

有没有一种方法可以使表架构本身不区分大小写,因此这些查询无需修改就可以工作

是的,可以,但是从Oracle 12cR2及更高版本开始。您可以在许多级别(列,表,模式)上进行定义:

-- default
CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100));

INSERT INTO tab2(i, name) VALUES (1, 'John');
INSERT INTO tab2(i, name) VALUES (2, 'Joe');
INSERT INTO tab2(i, name) VALUES (3, 'Billy');

SELECT /*csv*/ *
FROM tab2
WHERE name = 'jOHN' ;
/*
"I","NAME"
no rows selected
*/

SELECT /*csv*/
       column_id,
       column_name,
       collation
FROM   user_tab_columns
WHERE  table_name = 'TAB2'
ORDER BY column_id;
/*
"COLUMN_ID","COLUMN_NAME","COLLATION"
1,"I",""
2,"NAME","USING_NLS_COMP"
*/
Run Code Online (Sandbox Code Playgroud)

列级:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100) COLLATE BINARY_CI);

INSERT INTO tab2(i, name) VALUES (1, 'John');
INSERT INTO tab2(i, name) VALUES (2, 'Joe');
INSERT INTO tab2(i, name) VALUES (3, 'Billy');

SELECT /*csv*/ *
FROM tab2
WHERE name = 'jOHN' ;
/*
"I","NAME"
1,"John"
*/

-- COLUMN LEVEL

SELECT /*csv*/
       column_id,
       column_name,
       collation
FROM   user_tab_columns
WHERE  table_name = 'TAB2'
ORDER BY column_id;
/*
"COLUMN_ID","COLUMN_NAME","COLLATION"
1,"I",""
2,"NAME","BINARY_CI"
*/
Run Code Online (Sandbox Code Playgroud)

表级:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100)) 
DEFAULT COLLATION BINARY_CI;
Run Code Online (Sandbox Code Playgroud)

模式级别:

CREATE USER myuser IDENTIFIED BY myuser
DEFAULT TABLESPACE users
DEFAULT COLLATION BINARY_CI;
Run Code Online (Sandbox Code Playgroud)


Mik*_*sen 3

回答我自己的问题,因为我认为所提出的答案都没有真正解决该问题。

Oracle不支持不区分大小写的列类型的概念,并且区分大小写只能在数据库或会话级别进行控制。有几种方法可以解决这个问题,例如使列虚拟或通过视图读取,但每种方法都还要求您转换正确的操作数(例如WHERE X = UPPER(:p1).

我最终只是更新了我的数据库(这是来自 Active Directory 的用户名列表)以获得正确的大小写,因此我不再需要比较不区分大小写的情况。