Колонка запросов в Oracle тип данных CLOB
У меня есть таблица со столбцом clob. Необходимо выполнить поиск по содержимому столбца clob. Однако
select * from aTable where aClobColumn = 'value';
Терпит неудачу, но
select * from aTable where aClobColumn like 'value';
Кажется, работает отлично. Как oracle обрабатывает фильтрацию по столбцу clob. Поддерживает ли он только предложение "like", а не =,!= прием. То же самое и с другими базами данных, такими как mysql, postgres и т. д.
Кроме того, как этот сценарий обрабатывается в фреймворках, реализующих JPA, таких как hibernate ?
4 ответа:
Да, это не разрешено (это ограничение не влияет на сравнение
CLOB
s в PL / SQL) использовать операторы сравнения типа=
,!=
,<>
и так далее в SQL-операторах, при попытке чтобы сравнить два столбцаCLOB
или столбецCLOB
и символьный литерал, как вы это делаете. Быть в состоянии сделать такое сравнение в SQL-операторах, dbms_lob.можно использовать функцию compare().select * from aTable where dbms_lob.compare(aClobColumn, 'value') = 0
В приведенном выше запросе литерал
'value'
будет неявно преобразован в тип данныхCLOB
. Избегать неявное преобразование, литерал'value'
может быть явно преобразован вCLOB
введите данные с помощью функцииTO_CLOB()
и затем передайте в функциюcompare()
:select * from aTable where dbms_lob.compare(aClobColumn, to_clob('value')) = 0
Типа CLOB большие типы данных, которые могут хранить большие массивы данных и, следовательно, многие операторы, которые поддерживают тип varchar операций не будет работать на объект CLOB, но в PL/SQL и некоторые из них, как упомянуто здесь: http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221
Как вы можете видеть в таблице
Like
поддерживается как в Sql, так и в pl / sql для clobs, но=
не поддерживается в SQL, но есть в pl / sqlЕсли вам действительно нужно, вы можете конвертировать в varchar в sql и сравнить, как Том Кайт упоминает здесь Вот так: http://sqlfiddle.com/#!4 / 1878f6/1
select * from aTable where dbms_lob.substr( aClobColumn , length(aClobColumn), 1 )='value';
Так что не надо. Потому что если вы хотите сравнить данные - то может возникнуть ситуация, когда одно значение:
NULL
, а второеEMPTY_CLOB
А это уже для этого метода другое дело! Он возвращает -1, хотя с точки зрения данных-оба значения не должны содержать. Было бы правильно:dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob ()), NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob ()))