Как в запросе select проверить наличие blob ?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Как в запросе select проверить наличие blob ?

Сообщение 3m » 25 дек 2006, 23:07

Здравствуйте!

Есть таблица, один из столбцов blob, возникла необходимость в запросе select получать наряду с данными информацию о том пуст blob или нет.
Пока я придумал только один рабочий вариант - с использованием функции BlobSize из библиотеки FreeUDFLib, т.е. так:

Код: Выделить всё

SELECT name, param1, param2,...paramN, F_BLOBSIZE(audiodata) FROM mytable WHERE id=N
Смущает два момента: надо скачивать и устанавливать FreeUDFLib; размер blob мне знать не требуется, достаточно просто знать что audiodata IS NOT NULL.

Можно ли как-то более изящно решить данную задачу?

DS
Сообщения: 41
Зарегистрирован: 17 фев 2005, 16:54

Сообщение DS » 26 дек 2006, 00:35

SELECT name, param1, param2,...paramN, IIF(audiodata IS NULL, 'yes', 'no') isnull
FROM mytable WHERE id=N

iif кажись в только в fb2 появилось, в более ранних смотри в сторону CASE

3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Сообщение 3m » 26 дек 2006, 01:42

DS писал(а):SELECT name, param1, param2,...paramN, IIF(audiodata IS NULL, 'yes', 'no') isnull
FROM mytable WHERE id=N
iif кажись в только в fb2 появилось, в более ранних смотри в сторону CASE
У меня FB 1.5.3 - iif не работает.
CASE заработал:

Код: Выделить всё

SELECT name, param1, param2,...paramN,
case 
when audiodata IS NOT NULL THEN 1
ELSE 0
END
FROM mytable WHERE id=N
.


Есть еще вариант в разбивкой на два запроса:

Код: Выделить всё

/* 1 получаем данные */
SELECT name, param1, param2,...paramN FROM mytable WHERE id=N
/* 2 проверяем наличие blob */
SELECT COUNT(audiodata) FROM mytable WHERE id=N
Хотя COUNT везде ругают за "тяжеловесность", но в моем случае всегда берется только 1 строка.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 26 дек 2006, 08:12

Я не понял, а почему бы не писать просто SELECT ..., audiodata.... а потом на клиенте проверять FieldByName('audiodata').IsNull? Слишком умные компоненты?

3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Сообщение 3m » 26 дек 2006, 12:13

Dimitry Sibiryakov писал(а):Я не понял, а почему бы не писать просто SELECT ..., audiodata.... а потом на клиенте проверять FieldByName('audiodata').IsNull? Слишком умные компоненты?
Именно так.
Использую IBPP - он сам проверяет тип и обойти это нет возможности без глубокой рихтовки исходников IBPP.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 26 дек 2006, 13:46

Проверяет тип и что? Автоматически вытаскивает содержимое в память? Не верю...

Ответить