Колонка запросов в 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 22

4 ответа:

Да, это не разрешено (это ограничение не влияет на сравнение CLOBs в 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

Как насчет

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

Типа 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 ()))