Mik*_*sen 6 sql oracle entity-framework case-insensitive oracle11g
我想从Users
列Logon
中等于的表中选择行"foo"
- 但是,我还想返回"Foo"
或"FOO"
.
我可以这样做:
SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO';
Run Code Online (Sandbox Code Playgroud)
然后将我的参数转换为大写.但是,在我们的代码中,我们有数百个点,我们必须更新它.
有没有办法使表模式本身不区分大小写,所以这些查询只能在不修改的情况下工作?谢谢!
UPDATE
我宁愿不在整个数据库或会话级别更改区分大小写.更改SQL查询很难,因为我们使用.NET实体框架并且在整个地方都对这个表进行LINQ查询.除非您想要更改每个LINQ查询,否则EF似乎不支持自动转换大小写.
我宁愿不更改整个数据库或会话级别的区分大小写。
有没有一种方法可以使表架构本身不区分大小写,因此这些查询无需修改就可以工作
是的,可以,但是从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)
回答我自己的问题,因为我认为所提出的答案都没有真正解决该问题。
Oracle不支持不区分大小写的列类型的概念,并且区分大小写只能在数据库或会话级别进行控制。有几种方法可以解决这个问题,例如使列虚拟或通过视图读取,但每种方法都还要求您转换正确的操作数(例如WHERE X = UPPER(:p1)
.
我最终只是更新了我的数据库(这是来自 Active Directory 的用户名列表)以获得正确的大小写,因此我不再需要比较不区分大小写的情况。