2011-12-09 62 views
5

Tôi muốn chọn các hàng từ một bảng có tên là Users trong đó cột Logon bằng "foo" - Tuy nhiên, tôi cũng muốn trả lại "Foo" hoặc "FOO".Có cách nào trong Oracle để tạo cột không phân biệt chữ hoa chữ thường không?

tôi có thể làm một cái gì đó như:

SELECT Id, Name FROM Users WHERE UPPER(Logon) = 'FOO'; 

Và sau đó chuyển đổi tham số của tôi thành chữ hoa. Tuy nhiên, trong mã của chúng tôi, chúng tôi có hàng trăm điểm mà chúng tôi phải cập nhật điều này.

Có cách nào để làm cho giản đồ bảng không phân biệt chữ hoa chữ thường nên các truy vấn này sẽ hoạt động mà không sửa đổi? Cảm ơn!

CẬP NHẬT

Tôi không muốn thay đổi trường hợp nhạy cảm trong toàn bộ cơ sở dữ liệu hoặc ở cấp phiên làm việc. Việc thay đổi các truy vấn SQL là khó vì chúng ta sử dụng .NET Entity Framework và có các truy vấn LINQ đối với bảng này trên tất cả các nơi. Nó không xuất hiện EF hỗ trợ tự động chuyển đổi trường hợp trừ khi bạn muốn thay đổi mọi truy vấn LINQ.

+0

Kiểm tra http://stackoverflow.com/questions/2001165/oracle-11g-case-insensi tive-by-default – a1ex07

+0

Tôi đang tìm một cách để có bảng và/hoặc kiểm soát mức cột, tôi không muốn thay đổi toàn bộ cơ sở dữ liệu ngay bây giờ. –

Trả lời

3

Trả lời câu hỏi của riêng tôi vì tôi không cảm thấy rằng một trong các câu trả lời được đề xuất thực sự giải quyết được vấn đề.

Oracle không hỗ trợ khái niệm loại cột không phân biệt chữ hoa chữ thường và chỉ có thể kiểm soát độ nhạy trường hợp ở cấp cơ sở dữ liệu hoặc phiên. Có một vài cách xung quanh việc này, chẳng hạn như làm cho cột ảo hoặc đọc qua một chế độ xem, nhưng mỗi người trong số họ cũng sẽ yêu cầu bạn phải nhập toán hạng phù hợp (chẳng hạn như WHERE X = UPPER(:p1).

Tôi đã kết thúc chỉ cập nhật cơ sở dữ liệu của mình (danh sách tên người dùng từ Thư mục Họat động) để có các trường hợp chính xác, vì vậy tôi không còn phải so sánh phân biệt chữ hoa chữ thường.

0

Bạn thể thiết lập một cái nhìn trên bàn của bạn với tất cả các cột giống hệt nhau, ngoại trừ cho cột bị ảnh hưởng mà sẽ được upshifted - một cái gì đó như:

create view v_Users as 
select Id, Name, UPPER(Logon) Logon, ... 
FROM Users 

- sau đó làm một toàn cầu thay thế trên mã nguồn của bạn để thay đổi tên bảng thành tên chế độ xem - mặc dù nếu bảng của bạn được gọi là Người dùng, điều đó có thể khá nguy hiểm ...

+2

Ông cũng sẽ phải thay đổi tất cả các truy vấn của mình để vượt qua Logon như chữ hoa, đó là những gì ông đang cố gắng để tránh. –

+1

Yea đây là một ý tưởng, tôi vẫn phải viết lại tất cả các lựa chọn để đúc toán hạng bên phải cho trường hợp trên cũng mặc dù. Nếu tôi sẽ làm điều này, tôi cũng có thể cập nhật tất cả những nơi mà tôi tra cứu người dùng bằng Logon - Tôi nghĩ đó là những gì tôi phải làm :) –

1

Tôi không nghĩ bạn có thể làm điều đó chỉ cho một cột. Bạn có thể thử cách tiếp cận sau: làm cho cột Logon của bạn ảo thành UPPER(s_Logon) (tạo s_Logon, sao chép tất cả các giá trị từ cột Logon hiện tại, thả Logon, tạo nó thành ảo). Tôi tin rằng nó sẽ làm việc cho SELECT s, nhưng đối với insert/update s bạn sẽ cần truy cập 's_Logon'. Hy vọng rằng có ý nghĩa.

+0

Điều đó sẽ không làm cho cột luôn ở trên ? Tôi vẫn phải cast toán hạng bên phải vào trường hợp trên khi tôi so sánh nó. –

2

Tôi không thay đổi độ nhạy chữ hoa trong toàn bộ cơ sở dữ liệu hoặc tại phiên

Có cách nào để làm cho giản đồ bảng không phân biệt chữ hoa chữ thường nên các truy vấn này sẽ hoạt động mà không cần sửa đổi

Có, có thể nhưng từ phiên bản Oracle 12cR2 trở lên.Bạn có thể xác định nó trên nhiều cấp độ (cột, bảng, lược đồ):

-- 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" 
*/ 

Cột cấp:

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" 
*/ 

Bảng cấp:

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

Schema cấp:

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

Tính năng gọn gàng - đã không nghe nói về điều này. Thêm tại đây: https://oracle-base.com/articles/12c/column-level-collation-and-case-insensitive-database-12cr2 –

Các vấn đề liên quan