2008-11-25 32 views
14

Tôi có bảng, người dùng, trong cơ sở dữ liệu Oracle 9.2.0.6. Hai trong số các trường là varchar - last_name và first_name.Oracle - Chọn nơi trường có ký tự chữ thường

Khi hàng được chèn vào bảng này, trường tên và họ sẽ được đặt trong tất cả chữ hoa, nhưng bằng cách nào đó một số giá trị trong hai trường này là trường hợp hỗn hợp.

Tôi muốn chạy truy vấn sẽ hiển thị cho tôi tất cả các hàng trong bảng có tên hoặc họ có ký tự chữ thường trong đó.

Tôi đã tìm kiếm trên mạng và tìm thấy REGEXP_LIKE, nhưng điều đó phải dành cho các phiên bản oracle mới hơn - có vẻ như nó không hoạt động đối với tôi.

Một điều khác mà tôi đã thử là dịch "abcde ... z" thành "$$$$$ ... $" và sau đó tìm kiếm '$' trong trường của tôi, nhưng phải có cách tốt hơn ?

Cảm ơn trước!

Trả lời

49

Làm thế nào về điều này:

select id, first, last from mytable 
where first != upper(first) or last != upper(last); 
+0

awesome ... Tôi đã lập kế hoạch cho một vòng lặp – Sayka

1

Tôi nghĩ rằng SQL BQ và SQL thứ hai của Justin sẽ làm việc, bởi vì trong kịch bản này:

first_name  last_name 
----------  --------- 
bob    johnson 
Bob    Johnson 
BOB    JOHNSON 

Tôi muốn truy vấn của tôi để trả lại 2 hàng đầu tiên.

Tôi chỉ muốn đảm bảo rằng đây sẽ là truy vấn hiệu quả mặc dù - bảng của tôi có 500 triệu hàng trong đó.

Khi bạn nói trên (first_name)! = First_name, là "first_name" luôn luôn liên quan đến hàng hiện tại mà oracle đang xem? Tôi sợ sử dụng phương pháp này lúc đầu bởi vì tôi sợ rằng tôi sẽ tự mình tham gia vào bảng này, nhưng theo cách của họ, cả hai bạn đã viết ra câu lệnh SQL, có vẻ như kiểm tra bình đẳng chỉ hoạt động trên cơ sở từng hàng, sẽ làm việc cho tôi.

+2

Điều kiện được áp dụng trên cơ sở từng hàng. Tất nhiên, truy vấn của bạn sẽ phải quét toàn bộ bảng 500 triệu hàng để xử lý truy vấn, điều này sẽ chậm. Nếu đây là sự xuất hiện thường xuyên, chỉ mục dựa trên chức năng có thể hữu ích. –

+0

Điểm tốt, Justin. Tôi cũng sẽ thêm gợi ý chỉ mục dựa trên hàm. Ngoài ra, nếu dữ liệu thực sự được cho là chữ hoa, bạn có thể tạo trình kích hoạt để buộc điều này vào chèn. –

+1

Brian, không chắc bạn đang định làm gì, nhưng lưu ý rằng bạn cũng có thể chạy "cập nhật tập hợp mytable first_name = upper (first_name) và last_name = upper (last_name);" để chuẩn hóa tất cả dữ liệu của bạn ... bạn không cần phải tìm nạp nó theo hàng và cập nhật nó bên ngoài cơ sở dữ liệu. –

-1
SELECT * 
FROM mytable 
WHERE FIRST_NAME IN (SELECT FIRST_NAME 
         FROM MY_TABLE 
         MINUS 
         SELECT UPPER(FIRST_NAME) 
         FROM MY_TABLE) 
+0

Điều này không tìm thấy 'last_name' với sai trường hợp và truy cập bảng ba lần. Tại sao sẽ tốt hơn câu trả lời được chấp nhận? –

-2

cho SQL máy chủ nơi các thiết lập đối chiếu DB là trường hợp sử dụng không nhạy cảm như sau:

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1)) 
0

Nếu bạn đang tìm kiếm Oracle 10g hoặc cao hơn, bạn có thể sử dụng các ví dụ dưới đây. Hãy xem xét rằng bạn cần phải tìm ra các hàng mà bất kỳ chữ cái nào trong một cột là chữ thường.

Column1 
....... 
MISS 
miss 
MiSS 

Trong ví dụ trên, nếu bạn cần phải tìm các giá trị missMiSS, sau đó bạn có thể sử dụng các truy vấn dưới đây

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]'); 
-1

Hãy thử điều này:

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]','c'); => Miss, miss lower text 
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[A-Z]','c'); => Miss, MISS upper text 
+1

Cân nhắc mở rộng câu trả lời của bạn. Vui lòng giải thích cách mã này giải quyết vấn đề. –

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