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