Подтвердить что ты не робот

Запрос строки столбца оракула

У меня есть таблица с столбцом clob. Требуется поиск на основе содержимого столбца clob. Однако

select * from aTable where aClobColumn = 'value';

не работает, но

select * from aTable where aClobColumn like 'value';

похоже на работу. Как обработчик оракула обрабатывает столбцы clob. Поддерживает ли это только предложение "like", а не =,!= И т.д. То же самое с другими базами данных, такими как mysql, postgres и т.д.

Также как этот сценарий обрабатывается в рамках фреймворков, которые реализуют JPA как hibernate?

4b9b3361

Ответ 1

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

Ответ 2

как насчет

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

Ответ 3

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 и сравнивать, как Tom Kyte упоминает здесь следующим образом: http://sqlfiddle.com/#!4/1878f6/1

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

Ответ 4

Так не надо. Потому что если вы хотите сравнить данные - тогда это может быть ситуация, когда одно значение: NULL и второе EMPTY_CLOB И это для этого метода другое дело! Он возвращает -1, хотя с точки зрения данных - оба значения не должны содержать. Было бы правильно:

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