:: Visual Foxpro, Foxpro for DOS
CONVERT не работет в WHERE
lili

Сообщений: 434
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Приветствую всех!
Столкнулась с такой непонятностью. В таблице tblFiles поле content типа varbinary(max).
Следующий запрос срабатывает влет:
select top 100 t.id, isnull(convert(varchar(1),t.content),' ') as cont
from tblFiles t
Причем, поле cont везде не пустое.
Мне нужно выявить записи с заполненным полем content. Ставлю ту же формулу в WHERE и не могу дождаться результата:
select top 100 t.id from tblFiles t
where isnull(convert(varchar(1),t.content),' ')<>' '
В чем тут дело?
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
lili

Сообщений: 434
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
забыла сказать - запросы на SQL-сервер
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
isnull() что возвращает?
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
select top 100 t.id from tblFiles t
where t.content is not null


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 24.03.17 13:38
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
lili
Причем, поле cont везде не пустое.
Отлично.
Цитата:
Мне нужно выявить записи с заполненным полем content. Ставлю ту же формулу в WHERE и не могу дождаться результата:
select top 100 t.id from tblFiles t
where isnull(convert(varchar(1),t.content),' ')<>' '
В чем тут дело?
Может быть в том, что строки начинаются с пробела? Пустота и пробел - разные вещи. Проверки на не равность пробелу и на пустоту - тоже разные, хотя иногда и очень похожи.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
lili
не могу дождаться результата...
В чем тут дело?
В том что такой запрос не оптимизируется.
Есть большая разница между тем чтобы
"извлечь 100 произвольных записей и в каждой из них вычислить выражение" и
"извлечь записи в которых выражение такое-то, и из них отобрать 100". Оптимизатор может "не понять" твоего желания и начать обрабатывать всю таблицу целиком.

Нужно использовать оптимизируемые выражения, а в случае невозможности (но тут не похоже на такой случай) таки "ждать часами".

И да, ещё, запросы с TOP не имеют практического смысла (в продуктивной системе) в отсутствии опции упорядочения. 100 КАКИХ записей? Произвольных? Тех которым повезло пораньше попасть на обработку серверу Ну такое, наверное, бывает в жизни - 1 раз из миллиона - и это ОЧЕНЬ специфические случаи Гораздо чаще нужно 100 записей из выборки упорядоченной по определённым критериям. Т.е. нужна опция ORDER BY.
Конечно же для тестирования и тому подобных целей можно и без ORDER обойтись - просто не забывать что это 100 абы каких записей - не "первых", не "последних" - просто произвольно отрезанный кусок выборки.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
lili

Сообщений: 434
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
TOP я использовала для уменьшения запроса, он тут не суть.
Есть таблица документов docum и связанных с документов файлов tblFiles.
Я хочу выявить документы, в которых не записался связанный файл, то есть не заполнилось поле content.
И на самом деле запрос выглядит так:
select d.id, d.num1, d.num2, d.date1
from docum d with (index=ind2) -- date1
where d.date1>=?m.date
and exists (select top 1 t.id from tblFiles t with (index=ind2) -- id_docum
where t.id_docum=d.id and isnull(convert(varchar(1),t.content),' ')=' ')
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
lili

Сообщений: 434
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Еще добавлю:
- запрос прекрасно работал на SQL-2008
- после переноса базы на другой сервер SQL-2008+sp1 работать перестал
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
1. Зачем оптимизатор "напрягать" опцией index ?

2. Что значит "не записался" связанный файл?

Поле content может содержать space(1)?

Если не может, то сделать ему content varbinary(max) not null.

3. Добавить в таблицу tblFiles вычисляемое поле:

alter table tblFiles add column ContentCompute
as
(case when isnull(datalength(Content),(0))>(0) then (1) else (0) end)

4. Создать по ContentCompute индекс

CREATE NONCLUSTERED INDEX [IX_ContentCompute] ON [...].[tblFiles]
(
[ContentCompute] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

5. Тогда, запрос упроститься до безобразия:

select d.id, d.num1, d.num2, d.date1
from docum d
inner join tblFiles on t.id_docum=d.id and t.ContentCompute = 0
where d.date1>=?m.date


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 24.03.17 15:23
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
lili

Сообщений: 434
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
PaulWist
3. Добавить в таблицу tblFiles вычисляемое поле:
alter table tblFiles add column ContentCompute
as
(case when isnull(datalength(Content),(0))>(0) then (1) else (0) end)

Во-первых, спасибо за идею вычисляемого поля. А во-вторых, предложенная Вами проверка длины, а не содержимого поля сама по себе прекрасно сработала. Еще раз спасибо.
Ratings: 0 negative/0 positive
Re: CONVERT не работет в WHERE
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну так надо оптимизировать тот запрос который НАДО, а не то что "кажется похожим"

Для начала какой тип у поля content, допустимы ли для него NULL-ы и что является "не заполненностью" - NULL в этом поле, пустая строка (НЕ "один пробел"), или строка из одних лишь пробелов (плюс, возможно, другие "невидимые символы" - табуляторы, переводы строки и т.п.)
Исходя из этого и надо будет строить запрос.
И я на 99% уверен что в этом запросе не нужно будет никаких exists подзапросов, и тем паче явных конвертаций вида convert(varchar(1),t.content),' ').
Банально join этих 2-х таблиц и условие типа content is null или, возможно, content is null or DATALENGTH(content) = 0 - если "пустой но не null" тоже нужно отыскивать.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 (Гостей: 19)

© 2000-2024 Fox Club 
Яндекс.Метрика