Sql Oracle中有没有办法使列不区分大小写?

Sql Oracle中有没有办法使列不区分大小写?,sql,oracle,entity-framework,oracle11g,case-insensitive,Sql,Oracle,Entity Framework,Oracle11g,Case Insensitive,我想从名为Users的表中选择行,其中Logon列等于“foo”——但是,我还想返回“foo”或“foo” 我可以这样做: SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO'; create view v_Users as select Id, Name, UPPER(Logon) Logon, ... FROM Users 然后将我的参数转换为大写。然而,在我们的代码中,我们实际上有数百个点需要更新 有没有办法使表模式本身不区分大小写

我想从名为
Users
的表中选择行,其中
Logon
列等于
“foo”
——但是,我还想返回
“foo”
“foo”

我可以这样做:

SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO';
create view v_Users as
select Id, Name, UPPER(Logon) Logon, ...
FROM Users
然后将我的参数转换为大写。然而,在我们的代码中,我们实际上有数百个点需要更新

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

更新

我不希望在整个数据库或会话级别更改大小写敏感度。更改SQL查询很困难,因为我们使用.NET实体框架,并且到处都有针对该表的LINQ查询。EF似乎不支持自动转换大小写,除非您还想更改每个LINQ查询。

您可以在表上设置一个视图,使所有列都相同,但受影响的列除外,该列将被升档-类似于:

SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO';
create view v_Users as
select Id, Name, UPPER(Logon) Logon, ...
FROM Users

-然后对源代码进行全局替换,将表名更改为视图名-尽管如果表名为Users,这可能非常危险…

我认为不能仅为一列执行此操作。您可以尝试以下方法:将
Logon
列虚拟为
UPPER(s\u Logon)
(创建
s\u Logon
,复制现有
Logon
列中的所有值,删除
Logon
,将其创建为虚拟)。我相信它适用于
SELECT
s,但对于
insert/update
s,您需要访问“s\u Logon”。希望这是有意义的。

回答我自己的问题,因为我觉得两个建议的答案都没有真正解决这个问题

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

最后我只是更新了我的数据库(它是Active Directory中的用户名列表),以获得正确的大小写,因此我不再需要比较不区分大小写的数据

我不希望在整个数据库或会话级别更改大小写敏感度

有没有办法使表模式本身不区分大小写,这样这些查询就可以在不修改的情况下工作

是的,这是可能的,但来自Oracle 12cR2及更高版本。您可以在多个级别(列、表、架构)上定义它:

列级别:

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"
*/
表级别:

CREATE TABLE tab2(i INT PRIMARY KEY, name VARCHAR2(100)) 
DEFAULT COLLATION BINARY_CI;
架构级别:

CREATE USER myuser IDENTIFIED BY myuser
DEFAULT TABLESPACE users
DEFAULT COLLATION BINARY_CI;

检查我正在寻找一种方法来实现表级和/或列级控制,我现在不想更改整个数据库。这会不会使列始终为大写?在比较时,我仍然必须将正确的操作数转换为大写。他还必须更改所有查询以大写形式传递登录,这就是他所希望的试图避免。是的,这是一个想法,我仍然需要重新写入所有选择,以便将正确的操作数转换为大写。如果我要这样做,我还不如更新所有通过登录查找用户的位置——我认为这是我必须做的:)整洁功能——我没听说过这一点。详情如下: