Запрос строки столбца оракула
У меня есть таблица с столбцом clob. Требуется поиск на основе содержимого столбца clob. Однако
select * from aTable where aClobColumn = 'value';
не работает, но
select * from aTable where aClobColumn like 'value';
похоже на работу. Как обработчик оракула обрабатывает столбцы clob. Поддерживает ли это только предложение "like", а не =,!= И т.д. То же самое с другими базами данных, такими как mysql, postgres и т.д.
Также как этот сценарий обрабатывается в рамках фреймворков, которые реализуют JPA как hibernate?
Ответы
Ответ 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 ()))