2013-08-15 38 views
21

Tôi có một bảng có cột clob. Tìm kiếm dựa trên nội dung của cột clob cần được thực hiện. Tuy nhiênTruy vấn cột dấu ngoặc nhọn oracle

select * from aTable where aClobColumn = 'value';

thất bại nhưng

select * from aTable where aClobColumn like 'value'; 

dường như workfine. Làm thế nào oracle xử lý lọc trên một cột clob. Nó chỉ hỗ trợ mệnh đề 'like' chứ không phải là =,! = V.v. Có giống với các cơ sở dữ liệu khác như mysql, postgres, v.v.

Kịch bản này được xử lý như thế nào trong thực hiện JPA như ngủ đông?

+0

Có xem xét này http://stackoverflow.com/questions/17649011/search-for-a-particular-string-in-oracle -clob-column – user75ponic

Trả lời

30

Vâng, nó không cho phép (giới hạn này không ảnh hưởng đến CLOB s so sánh trong PL/SQL) sử dụng toán tử so sánh như =, !=, <> và như vậy trong câu lệnh SQL, khi cố gắng để so sánh hai CLOB cột hoặc CLOB cột và ký tự theo nghĩa đen, giống như bạn. Để được có thể thực hiện so sánh như vậy trong các câu lệnh SQL, có thể sử dụng chức năng dbms_lob.compare().

select * 
    from aTable 
    where dbms_lob.compare(aClobColumn, 'value') = 0 

Trong truy vấn trên, 'value' đen sẽ được ngầm chuyển đổi sang loại CLOB dữ liệu. Để tránh chuyển đổi ngầm, các 'value' đen có thể được chuyển đổi một cách rõ ràng để loại CLOB dữ liệu sử dụng TO_CLOB() chức năng và sau đó vượt qua vào compare() chức năng:

select * 
    from aTable 
    where dbms_lob.compare(aClobColumn, to_clob('value')) = 0 
+0

là hành vi này giống với tất cả các cơ sở dữ liệu khác như postgres cũng như –

+0

@DevBlanked PostgreeSQl có kiểu dữ liệu 'TEXT' (không có' CLOB') và [cho phép] (http: //www.sqlfiddle .com/#!1/193dd/5) bạn sử dụng toán tử so sánh để so sánh các giá trị của kiểu dữ liệu đó với nhau hoặc một chuỗi ký tự. –

+0

Hãy coi chừng rằng "Các hàm có giá trị đầu vào NULL hoặc không hợp lệ cho các tham số trả về giá trị NULL". Điều này có thể có ý nghĩa trong một số trường hợp. – Vadzim

1

CLOB của những kiểu dữ liệu lớn có thể lưu trữ dữ liệu lớn và do đó nhiều nhà khai thác có hỗ trợ các hoạt động varchar sẽ không hoạt động trên CLOB, nhưng trong PL/SQL một số trong số họ làm như đề cập ở đây: http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221

Như bạn có thể thấy trong bảng Like được hỗ trợ trong cả Sql và pl/sql cho clobs, nhưng = không được hỗ trợ trong SQL, nhưng nằm trong pl/sql

Nếu bạn thực sự cần bạn có thể chuyển đổi thành varchar trong sql và so sánh như Tom Kyte đề cập đến here như sau: http://sqlfiddle.com/#!4/1878f6/1

select * from aTable where dbms_lob.substr(aClobColumn , length(aClobColumn), 1)='value'; 
0

Vì vậy không. Bởi vì nếu bạn muốn so sánh dữ liệu - thì đó có thể là một tình huống mà một giá trị: NULL và số thứ hai EMPTY_CLOB Và đó là vấn đề khác cho phương pháp này! Nó trả về -1, mặc dù về mặt dữ liệu - cả hai giá trị không nên chứa. Sẽ là đúng:

dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob()), NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob())) 
4

thế nào về

select * from table_name where to_char(clob_column) ="test_string" 
+3

'TO_CHAR()' chỉ hoạt động cho các nhánh có độ dài dưới 4000 ký tự. – wweicker