2013-08-15 25 views
21

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

select * from aTable where aClobColumn = 'value';

терпит неудачу, но

select * from aTable where aClobColumn like 'value'; 

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

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

+0

Посмотрите на это http://stackoverflow.com/questions/17649011/search-for-a-particular-string-in-oracle -clob-column – user75ponic

ответ

30

Да, это не допускается (это ограничение не влияет на 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 
+0

- это поведение одинаково со всеми другими базами данных, такими как postgres, а также –

+0

@DevBlanked PostgreeSQl имеет тип данных 'TEXT' (тип' CLOB') и [разрешает] (http: //www.sqlfiddle .com/#!1/193dd/5) вы используете операторы сравнения для сравнения значений этого типа данных друг с другом или строкового литерала. –

+0

Помните, что «Функции с NULL или недопустимыми входными значениями для параметров возвращают NULL». В некоторых случаях это может быть значительным. – Vadzim

1

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 и сравнить, как Том Кайт упоминает here примерно: http://sqlfiddle.com/#!4/1878f6/1

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

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

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

как о

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

'TO_CHAR()' работает только для клобов длиной менее 4000 символов. – wweicker

Смежные вопросы